【问题标题】:Method reference ↔ lambda equivalence [duplicate]方法参考 ↔ lambda 等价[重复]
【发布时间】:2018-10-16 09:50:51
【问题描述】:

如果您将光标放在 IntelliJ IDEA 中的绑定接收器方法引用上,例如 str::toUpperCase 并按 Alt+Enter,它会提供用 lambda 替换它。如果继续,它会将方法引用更改为() -> str.toUpperCase()。这可能是 IntelliJ IDEA 中的一个错误,尽管我怀疑这也是其他 IDE 中的一个常见错误。为什么?嗯,它并不总是等价的。拿下面的小谜题。以下代码的输出是什么?

import java.util.function.Supplier;

public class Scratch {

    private static String str;

    public static void main(String[] args) {
        str = "a";
        Supplier<String> methodref = str::toUpperCase;
        Supplier<String> lambda = () -> str.toUpperCase();

        str = "b";
        System.out.println(methref.get());
        System.out.println(lambda.get());
    }
}

这段代码表明方法引用和 lambda 是不等价的。代码在每一行打印不同的值:“a”和“b”。我的问题是:这种方法引用的正确 lambda 等效项是什么?

【问题讨论】:

  • 关于 IntelliJ 错误,只是它应该指出“(可能更改语义)”,就像它在以相反方式执行时一样。你应该举报。

标签: java intellij-idea method-reference


【解决方案1】:

对于您的供应商设置,答案是:没有等价物。

当你写作时:

str = "a";
Supplier<String> methodref = str::toUpperCase;

它实际上变成了"a"::toUpperCase(实际编译)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2021-03-10
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多