方法引用 ↔ lambda 等价性



如果您将光标放在绑定接收器方法引用(例如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 等价物是什么?

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

当你写:

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

它从字面上变成了"a"::toUpperCase(实际上是编译的(。

最新更新