Java Lambda方法参考中的“新”关键字

时间:2018-11-21 12:46:01

标签: java lambda java-8 method-reference

我见过很多方法,这些方法在lambda方法参考中实例化了一个新类,但似乎无法理解原因。方法参考中何时需要new关键字?

例如,以下通过编译:

UnaryOperator<String>stringToUpperCase = String::toUpperCase;

但这不是:

UnaryOperator<String>stringToUpperCase = new String()::toUpperCase; 

2 个答案:

答案 0 :(得分:16)

String::toUpperCase是一种方法引用,可以应用于任何String实例。

new String()::toUpperCase是一种方法引用,可以应用于特定的String实例(由new String()创建的实例)。

由于UnaryOperator<String>期望使用一个String并返回一个String的方法,因此String::toUpperCase是合适的(因为您可以将其应用于String并获取该String的大写版本。

另一方面,new String()::toUpperCase不适合UnaryOperator<String>,因为它是在已经指定的String上执行的,因此您不能传递另一个String实例

但是,可以将其分配给Supplier<String>,因为它只是提供了一个空的String实例:

Supplier<String> emptyStringToUpperCase = new String()::toUpperCase; 

这类似于:

Supplier<String> emptyStringToUpperCase = () -> new String().toUpperCase();

与此同时:

UnaryOperator<String> stringToUpperCase = String::toUpperCase;

类似于:

UnaryOperator<String> stringToUpperCase = s -> s.toUpperCase();

答案 1 :(得分:5)

有以下四种方法引用,您的类型属于第二类,但是UnaryOperator<String>本质上需要表示一个接受 any String参数并返回String的方法。但是,您使用的无效方法引用实际上正在处理特定字符串对象(即不是任何字符串对象)

enter image description here

引用:https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html