【问题标题】:"new" Keyword In Java Lambda Method Reference [duplicate]Java Lambda方法参考中的“新”关键字[重复]
【发布时间】:2018-11-21 12:46:01
【问题描述】:

我见过很多在 lambda 方法引用中实例化新类的方法,但似乎不明白为什么。方法引用中何时需要 new 关键字?

例如以下通过编译:

UnaryOperator<String>stringToUpperCase = String::toUpperCase;

但这不是:

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

【问题讨论】:

  • 一个新的大写字符串仍然只是一个空白字符串,所以s -&gt; ""会做同样的事情

标签: java lambda java-8 method-reference


【解决方案1】:

String::toUpperCase 是一个方法引用,可以应用于任何String 实例。

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

因为UnaryOperator&lt;String&gt; 需要一个接受String 并返回String 的方法,所以String::toUpperCase 适合(因为您可以将它应用于String 并获得String 的大写版本) .

另一方面,new String()::toUpperCase 不适合 UnaryOperator&lt;String&gt;,因为它是在已指定的 String 上执行的,因此您不能将另一个 String 实例传递给它。

但是,它可以通过分配给Supplier&lt;String&gt;,因为它只是提供一个空的String 实例:

Supplier<String> emptyStringToUpperCase = new String()::toUpperCase; 

这类似于:

Supplier<String> emptyStringToUpperCase = () -> new String().toUpperCase();

此时:

UnaryOperator<String> stringToUpperCase = String::toUpperCase;

类似于:

UnaryOperator<String> stringToUpperCase = s -> s.toUpperCase();

【讨论】:

    【解决方案2】:

    如下所示有四种方法引用,你的类型属于第二类,但UnaryOperator&lt;String&gt;本质上需要表示一个接受any字符串参数并返回字符串的方法。但是,您使用的非工作方法引用实际上正在处理 特定 String 对象(即不是 any String 对象)

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

    【讨论】:

    • 严格来说,new String()::toUpperCase 确实是第三种方法引用(new String() 是具有toUpperCase 方法的对象)。它不接受参数,但返回String。它可以用作Supplier&lt;String&gt;。但是() -&gt; ""的表达方式非常复杂。
    • @glglgl 其实是第二种吧?
    • 从 0 开始计数,即使是第一个 :P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多