"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 的方法,因此 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();
我见过很多在 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 的方法,因此 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();