Java Intellij-可替换为方法引用

Java Intellij-可替换为方法引用,java,intellij-idea,Java,Intellij Idea,当我使用lambda表达式时,总是这样: .map(obj -> foo.makeSomething(obj)) IntelliJ建议:“可以替换为方法引用…”。当我尝试时: .map(Foo::makeSomething) 我得到以下语句:“不能从静态上下文引用非静态方法” 为什么Idea建议我在方法引用不正确时使用它?正如您所写: map(Foo::makeSomething) 编译器期望以下两种可能性之一: 对必须定义为Foo的lambda的第一个参数调用Foo.makeSo

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

.map(obj -> foo.makeSomething(obj))
IntelliJ建议:“可以替换为方法引用…”。当我尝试时:

.map(Foo::makeSomething)
我得到以下语句:“不能从静态上下文引用非静态方法”

为什么Idea建议我在方法引用不正确时使用它?

正如您所写:

map(Foo::makeSomething)
编译器期望以下两种可能性之一:

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

  • 调用
    Foo.makeSomething()
    static方法

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

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

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

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


事实上,您需要对不构成lambda参数一部分的变量应用
makeSomething()
instance方法。
您可以这样做,但需要使用另一种语法

不要指定
Foo::
,而是使用
Foo::

这样,实例方法
makeSomething()
将应用于
foo
变量:

map(foo::makeSomething)

IntelliJ意图

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

用方法引用替换lambda

一些截图:


它是否真的建议进行替换?或者这正是您自己编写的?我希望
foo::makeSomething
,这会起作用。它是
foo::makeSomething
。您希望在对象foo上调用该方法,而不是在类foo上。您也可以让IntelliJ为您转换代码(Alt Enter).可能与您使用的IntelliJ IDEA的哪个版本重复?@JBNizet TY用于该快捷方式-天哪,我不知道如何告诉IJ这样做!它给出的只是一个无用的弹出窗口,甚至是更无用的建议,让您转到与此确切代码无关的设置!!现在越来越倾向于Eclipse:(它很好地具有右键单击选项,非常感谢您,我不知道我可以对object使用引用。我认为只有当我调用ClassName::metohd时它才有效。欢迎:)事实上,您有三种情况可以应用方法引用:1)静态方法,2)lambda参数的实例方法和3)lambda参数中未声明的变量的实例方法。最后一种情况下,语法确实不同。正如@Eli所说,如果方法在同一类中,则必须使用“this”而不是类名。