我见过很多方法,这些方法在lambda方法参考中实例化了一个新类,但似乎无法理解原因。方法参考中何时需要new
关键字?
例如,以下通过编译:
UnaryOperator<String>stringToUpperCase = String::toUpperCase;
但这不是:
UnaryOperator<String>stringToUpperCase = new String()::toUpperCase;
答案 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的方法。但是,您使用的无效方法引用实际上正在处理特定字符串对象(即不是任何字符串对象)
引用:https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html