Intellij - 可以用方法参考替换
2022-08-31 13:12:36
总是当我使用这样的lambda表达式时:
.map(obj -> foo.makeSomething(obj))
IntelliJ建议:“可以用方法参考代替...”。当我尝试时:
.map(Foo::makeSomething)
我得到以下语句:“不能从静态上下文中引用非静态方法”。
为什么Idea建议我应该使用方法参考,如果它不正确?
总是当我使用这样的lambda表达式时:
.map(obj -> foo.makeSomething(obj))
IntelliJ建议:“可以用方法参考代替...”。当我尝试时:
.map(Foo::makeSomething)
我得到以下语句:“不能从静态上下文中引用非静态方法”。
为什么Idea建议我应该使用方法参考,如果它不正确?
当你写:
map(Foo::makeSomething)
编译器期望以下两种可能性之一:
在 lambda 的第一个参数上调用实例方法,该参数必须如此定义为 .Foo.makeSomething()
Foo
调用静态方法。Foo.makeSomething()
编译器消除了第一种可能性,因为所声明的 lambda 的第一个参数不是 。obj
Foo
并且根据您的错误消息,是一个实例方法:Foo.makeSomething()
不能从静态上下文中引用非静态方法”
因此,第二种可能性(调用静态方法)既不合法,也不具有静态。Foo.makeSomething()
makeSomething()
实际上,您需要的是在不构成 lambda 参数一部分的变量上应用实例方法。
你可以这样做,但你需要使用另一种语法。makeSomething()
不要指定 ,请使用 。
这样,实例方法将应用于变量:Foo::
foo::
makeSomething()
foo
map(foo::makeSomething)
IntelliJ Intention
请注意,报告可以用方法引用替换的 lambda 的检查也可以由 IDE 通过意图自动重构。
为此,请将光标设置在 lambda 上(其上的任何位置)并显示上下文意图(默认情况下)。你应该看到意图:Alt+Enter
将 lambda 替换为方法引用
一些截图 :