Intellij - 可以用方法参考替换

use*_*ser 64 java intellij-idea

总是在我使用这样的lambda表达式时:

.map(obj -> foo.makeSomething(obj))
Run Code Online (Sandbox Code Playgroud)

IntelliJ建议:"可以用方法参考替换......".当我尝试的时候:

.map(Foo::makeSomething)
Run Code Online (Sandbox Code Playgroud)

我得到以下声明:"无法从静态上下文引用非静态方法".

为什么Idea会告诉我如果它不正确我应该使用方法参考?

dav*_*xxx 85

当你写:

map(Foo::makeSomething)
Run Code Online (Sandbox Code Playgroud)

编译器期望这两种可能性之一:

  • Foo.makeSomething()在lambda的第一个参数上调用一个实例方法,该方法必须定义为a Foo.

  • 调用Foo.makeSomething()静态方法.

编译器消除了第一种可能性,因为声明的lambda的第一个参数obj不是a Foo.

并根据您的错误消息,Foo.makeSomething()是一个实例方法:

无法从静态上下文引用非静态方法"

因此,第二种可能性(调用Foo.makeSomething()静态方法)也不合法,因为makeSomething()它不是静态的.


实际上,您想要的是将makeSomething()实例方法应用于不构成lambda参数一部分的变量.
你可以这样做,但你需要使用另一种语法.

而不是指定Foo::,使用foo::.
这样,实例方法makeSomething()将应用于foo变量:

map(foo::makeSomething)
Run Code Online (Sandbox Code Playgroud)

IntelliJ意图

请注意,报告lambda的检查可以用方法引用替换,IDE也可以通过意图自动重构.
为此,将光标设置在lambda(其上的任何位置)并显示上下文意图(Alt+Enter默认情况下).你应该看到意图:

用方法引用替换lambda

一些截图:

意图命题

意图结果

  • 非常感谢,我不知道我可以使用带有对象的引用.我认为只有当我调用ClassName :: metohd时它才有用. (6认同)