Cla*_*ake 8 java lambda java-8 method-reference
我已经看到很多方法,其中一个新类在lambda方法引用中实例化,但似乎无法理解为什么.何时是new方法引用中需要的关键字?
例如,以下传递编译:
UnaryOperator<String>stringToUpperCase = String::toUpperCase;
Run Code Online (Sandbox Code Playgroud)
但这不是:
UnaryOperator<String>stringToUpperCase = new String()::toUpperCase;
Run Code Online (Sandbox Code Playgroud)
Era*_*ran 16
String::toUpperCase是一个可以应用于任何String实例的方法引用.
new String()::toUpperCase是一个方法引用,可以应用于特定String实例(由其创建的实例new String()).
因为UnaryOperator<String>需要一个方法,它接受a String并返回a String,String::toUpperCase拟合(因为你可以将它应用于a String并得到它的大写版本String).
另一方面,由于它是在已经指定的情况下执行的,因此new String()::toUpperCase不适合,因此您无法将另一个实例传递给它.UnaryOperator<String>StringString
但是,它可以分配给a Supplier<String>,因为它只提供一个空String实例:
Supplier<String> emptyStringToUpperCase = new String()::toUpperCase;
Run Code Online (Sandbox Code Playgroud)
这类似于:
Supplier<String> emptyStringToUpperCase = () -> new String().toUpperCase();
Run Code Online (Sandbox Code Playgroud)
而这个:
UnaryOperator<String> stringToUpperCase = String::toUpperCase;
Run Code Online (Sandbox Code Playgroud)
类似于:
UnaryOperator<String> stringToUpperCase = s -> s.toUpperCase();
Run Code Online (Sandbox Code Playgroud)
有四种方法引用,如下所示,您的类型属于第二类,但UnaryOperator<String>基本上需要表示接受任何 String参数并返回String的方法.但是,您使用的非工作方法引用实际上是在处理特定的 String对象(即不是任何 String对象)
参考:https: //docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
| 归档时间: |
|
| 查看次数: |
690 次 |
| 最近记录: |