use*_*ser 64 java intellij-idea
总是在我使用这样的lambda表达式时:
.map(obj -> foo.makeSomething(obj))
Run Code Online (Sandbox Code Playgroud)
IntelliJ建议:"可以用方法参考替换......".当我尝试的时候:
.map(Foo::makeSomething)
Run Code Online (Sandbox Code Playgroud)
我得到以下声明:"无法从静态上下文引用非静态方法".
为什么Idea会告诉我如果它不正确我应该使用方法参考?
dav*_*xxx 85
当你写:
map(Foo::makeSomething)
Run Code Online (Sandbox Code Playgroud)
编译器期望这两种可能性之一:
Foo.makeSomething()在lambda的第一个参数上调用一个实例方法,该方法必须定义为a Foo.
调用Foo.makeSomething()静态方法.
编译器消除了第一种可能性,因为声明的lambda的第一个参数obj不是a Foo.
并根据您的错误消息,Foo.makeSomething()是一个实例方法:
无法从静态上下文引用非静态方法"
因此,第二种可能性(调用Foo.makeSomething()静态方法)也不合法,因为makeSomething()它不是静态的.
实际上,您想要的是将makeSomething()实例方法应用于不构成lambda参数一部分的变量.
你可以这样做,但你需要使用另一种语法.
而不是指定Foo::,使用foo::.
这样,实例方法makeSomething()将应用于foo变量:
map(foo::makeSomething)
Run Code Online (Sandbox Code Playgroud)
IntelliJ意图
请注意,报告lambda的检查可以用方法引用替换,IDE也可以通过意图自动重构.
为此,将光标设置在lambda(其上的任何位置)并显示上下文意图(Alt+Enter默认情况下).你应该看到意图:
用方法引用替换lambda
一些截图:
| 归档时间: |
|
| 查看次数: |
44873 次 |
| 最近记录: |