总是当我使用这样的lambda表达式时:
.map(obj -> foo.makeSomething(obj))
IntelliJ建议:“可以用方法参考替换......”。当我尝试的时候:
.map(Foo::makeSomething)
我得到以下声明:“无法从静态上下文引用非静态方法”。
为什么Idea会告诉我如果它不正确我应该使用方法参考?
答案 0 :(得分:63)
在你写的时候:
map(Foo::makeSomething)
编译器期望这两种可能性中的一种:
在lambda的第一个参数上调用Foo.makeSomething()
实例方法,该方法必须定义为Foo
。
调用Foo.makeSomething()
静态方法。
编译器消除了第一种可能性,因为声明为obj
的lambda的第一个参数不是Foo
。
根据您的错误消息,Foo.makeSomething()
是一个实例方法:
无法从静态上下文“
引用非静态方法
因此,第二种可能性(调用Foo.makeSomething()
静态方法)也不合法,因为makeSomething()
不是静态的。
实际上,您想要的是将makeSomething()
实例方法应用于不构成lambda参数的变量。
你可以这样做,但你需要使用另一种语法。
使用Foo::
而不是指定foo::
这样,实例方法makeSomething()
将应用于foo
变量:
map(foo::makeSomething)
IntelliJ意图
请注意,报告lambda的检查可以用方法引用替换,IDE也可以通过意图自动重构。
为此,将光标设置在lambda(其上的任何位置)并显示上下文意图(默认情况下为Alt+Enter
)。你应该看到意图:
用方法参考替换lambda
一些截图: