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