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

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)


Ank*_*goo 5

有四种方法引用,如下所示,您的类型属于第二类,但UnaryOperator<String>基本上需要表示接受任何 String参数并返回String的方法.但是,您使用的非工作方法引用实际上是在处理特定的 String对象(即不是任何 String对象)

在此输入图像描述

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

  • @glglgl其实,第二种类型吧? (3认同)