Внешний аргумент для ссылки на метод в Java 8

Я хочу передать внешний параметр в ссылку на метод:

String prefix = "The number is :";
numbers.forEach(Main::printWithPrefix);

private static void printWithPrefix(Integer number) {
    System.out.println(number);
}

Я понятия не имею, как это сделать. Я могу сделать это с помощью лямбды:

String prefix = "The number is :";
numbers.forEach(number -> {
    System.out.println(prefix + number);
});

Можно ли передать внешний параметр в ссылку на метод?


person poiuytrez    schedule 01.08.2016    source источник


Ответы (1)


Нет, вы не можете передать параметр в ссылку на метод. Что вы можете сделать, так это создать метод, который возвращает Consumer:

private static Consumer<Integer> printWithPrefix(String prefix) {
    return number -> System.out.println(prefix + number);
}

Затем это работает как фабрика для создания Consumer, которую вы можете передать numbers.forEach:

String prefix = "The number is :";
numbers.forEach(printWithPrefix(prefix));

Вы даже можете сделать его немного более общим, создав метод printWithPrefix, который принимает Consumer в качестве аргумента, чтобы вы могли передать другой, если хотите:

private static Consumer<Integer> printWithPrefix(String prefix,
                                                 Consumer<Integer> printer) {
    return number -> {
        System.out.print(prefix);
        printer.accept(number);
    };
}

Вы можете использовать его, например, с методом printNumber:

private static void printNumber(Integer number) {
    System.out.println(number);
}

String prefix = "The number is :";
numbers.forEach(printWithPrefix(prefix, Main::printNumber));
person Jesper    schedule 01.08.2016