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