始终当我使用lambda表达式是这样的:
.map(obj -> foo.makeSomething(obj))
的IntelliJ建议:“可与方法引用来代替......”。当我尝试过:
.map(Foo::makeSomething)
我得到了如下声明:“非静态方法不能从静态上下文中引用”。
为什么理念暗示我,我应该使用方法的参考,如果它是不正确?
当你写:
map(Foo::makeSomething)
编译器期望这两种可能性之一:
调用Foo.makeSomething()
在具有拉姆达的第一个参数的实例方法被如此定义为Foo
。
调用Foo.makeSomething()
静态方法。
第一种可能性是由编译器作为拉姆达的第一个参数声明消除obj
不是Foo
。
并根据您的错误信息,Foo.makeSomething()
是一个实例方法:
非静态方法不能从静态上下文”引用
因此,第二种可能性(调用Foo.makeSomething()
静态方法)是不合法无论是作为makeSomething()
也不是一成不变的。
事实上,你想要的是应用makeSomething()
实例方法对变量,不会使拉姆达参数的一部分。
你可以这样做,但你需要使用另一种语法。
相反的规定Foo::
,使用foo::
。
以这种方式,实例方法makeSomething()
将在被施加foo
变量:
map(foo::makeSomething)
意向的IntelliJ
请注意,该检查可以与方法的引用来代替报告lambda表达式也可以自动由IDE经由意图重构。
要做到这一点,设置在拉姆达(在任何地方)光标,显示上下文的意图(Alt+Enter
默认情况下)。你应该看到的意图:
替换方法参考拉姆达
一些截图:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句