gpt4 book ai didi

java - Intellij - 可以用方法引用代替

转载 作者:IT老高 更新时间:2023-10-28 20:27:09 27 4
gpt4 key购买 nike

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

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

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

.map(Foo::makeSomething)

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

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

最佳答案

如你所愿:

map(Foo::makeSomething)

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

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

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

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

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

Non-static method cannot be referenced from a static context"

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


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

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

map(foo::makeSomething)

IntelliJ 意图

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

Replace lambda with method reference

一些截图:

intention proposition

intention result

关于java - Intellij - 可以用方法引用代替,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44874857/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com