Java 8中方法引用的外部参数

poi*_*rez 3 java lambda java-8 method-reference

我期待将外部参数传递给方法引用:

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

private static void printWithPrefix(Integer number) {
    System.out.println(number);
}
Run Code Online (Sandbox Code Playgroud)

我不知道怎么做.我能用lambda做到这一点:

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

是否可以将外部参数传递给方法引用?

Jes*_*per 7

不,您不能将参数传递给方法引用.你可以做的是创建一个返回Consumer:

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

然后,这可以作为创建Consumer可以传递给的工厂numbers.forEach:

String prefix = "The number is :";
numbers.forEach(printWithPrefix(prefix));
Run Code Online (Sandbox Code Playgroud)

您甚至可以使它更通用,创建一个printWithPrefix方法,将一个Consumer参数作为参数,以便您可以传入另一个,如果您想:

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

例如,您可以使用它来使用它printNumber:

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

String prefix = "The number is :";
numbers.forEach(printWithPrefix(prefix, Main::printNumber));
Run Code Online (Sandbox Code Playgroud)