的Intellij - 可以与方法参考来代替

用户:

始终当我使用lambda表达式是这样的:

.map(obj -> foo.makeSomething(obj))

的IntelliJ建议:“可与方法引用来代替......”。当我尝试过:

.map(Foo::makeSomething)

我得到了如下声明:“非静态方法不能从静态上下文中引用”。

为什么理念暗示我,我应该使用方法的参考,如果它是不正确?

davidxxx:

当你写:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章