"new" Java Lambda 方法参考中的关键字

"new" Keyword In Java Lambda Method Reference

我见过很多在 lambda 方法引用中实例化新 class 的方法,但似乎无法理解原因。什么时候方法引用中需要 new 关键字?

例如,以下通过编译:

UnaryOperator<String>stringToUpperCase = String::toUpperCase;

但这不是:

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

下面有四种方法引用,你的类型属于第二类,但是UnaryOperator<String>本质上需要表示一个接受anyString的方法参数和 returns 一个字符串。但是,您使用的非工作方法参考实际上是在 particular String 对象上工作(即不是 any String 对象)

参考:https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

String::toUpperCase 是可以应用于任何 String 实例的方法参考。

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

由于 UnaryOperator<String> 需要一个采用 String 和 returns 的方法,因此 StringString::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();