Intellij - 可以用方法参考

时间:2017-07-02 20:17:22

标签: java intellij-idea

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

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

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

.map(Foo::makeSomething)

我得到以下声明:“无法从静态上下文引用非静态方法”。

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

1 个答案:

答案 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

一些截图:

intention proposition

intention result