【问题标题】:Intellij - can be replaced with method referenceIntellij - 可以用方法参考代替
【发布时间】:2017-07-02 20:17:22
【问题描述】:

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

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

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

.map(Foo::makeSomething)

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

为什么 Idea 建议我使用不正确的方法参考?

【问题讨论】:

  • 它实际上是否建议更换?或者这就是你自己写的?我原以为foo::makeSomething 会起作用。
  • 它是foo::makeSomething。您想在对象 foo 上调用该方法,而不是在类 Foo 上。您也可以让 IntelliJ 为您转换代码(Alt-Enter)。
  • 您使用的是哪个版本的 IntelliJ IDEA?
  • @JBNizet TY 为那个捷径——天哪,我这辈子都不知道如何告诉 IJ 去做!它给出的只是一个无用的弹出窗口,甚至更无用的建议去设置与这个确切的代码无关的设置!现在越来越倾向于 Eclipse :( 右键单击​​选项非常好

标签: java intellij-idea


【解决方案1】:

如你所愿:

map(Foo::makeSomething)

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

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

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

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

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

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

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


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

不要指定Foo::,而是使用foo::
这样,实例方法makeSomething()就会应用到foo变量上:

map(foo::makeSomething)

IntelliJ 意图

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

用方法引用替换 lambda

一些截图:

【讨论】:

  • 非常感谢,我不知道我可以将引用与对象一起使用。我认为它只有在我调用 ClassName::methohd 时才有效。
  • 不客气 :) 实际上,您有三种情况可以应用方法引用:1)静态方法,2)lambda 参数的实例方法和 3)未声明的变量的实例方法拉姆达参数。而对于最后一种情况,语法确实不同。
  • 正如@Eli 已经说过的,如果方法在同一个类中,那么你必须使用'this'而不是类名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2021-11-16
  • 2013-06-05
  • 2012-03-21
相关资源
最近更新 更多