【发布时间】: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