Intellij - 可以用方法参考替换

2022-08-31 13:12:36

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

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

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

.map(Foo::makeSomething)

我得到以下语句:“不能从静态上下文中引用非静态方法”。

为什么Idea建议我应该使用方法参考,如果它不正确?


答案 1

当你写:

map(Foo::makeSomething)

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

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

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

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

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

不能从静态上下文中引用非静态方法”

因此,第二种可能性(调用静态方法)既不合法,也不具有静态。Foo.makeSomething()makeSomething()


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

不要指定 ,请使用 。
这样,实例方法将应用于变量:Foo::foo::makeSomething()foo

map(foo::makeSomething)

IntelliJ Intention

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

将 lambda 替换为方法引用

一些截图 :

intention proposition

intention result


答案 2

推荐