Not*_*bug 1 java lambda java-8 method-reference
考虑下面的代码,
class DemoStatic {
public static Runnable testStatic() {
return () -> {
System.out.println("Run");
};
}
public void runTest () {
Runnable r = DemoStatic::testStatic;
r.run();
}
}
public class MethodReferenceDemo {
public static void main(String[] args) {
DemoStatic demo = new DemoStatic();
demo.runTest();
}
}
Run Code Online (Sandbox Code Playgroud)
run()应该调用Runnable正由testStatic方法返回的实例的方法.控制台上的输出应为"运行".
但是这段代码没有调用run()实例的方法,r也没有任何东西在控制台中打印出来.
有人可以解释原因.
如果我没有正确使用方法参考"::",请评论.
这个
Runnable r = DemoStatic::testStatic;
Run Code Online (Sandbox Code Playgroud)
返回Runnable其run()方法中包含的方法体testStatic(),即.
public static Runnable testStatic() {
return () -> {
System.out.println("Run");
};
}
Run Code Online (Sandbox Code Playgroud)
所以
r.run();
Run Code Online (Sandbox Code Playgroud)
基本上执行
return () -> {
System.out.println("Run");
};
Run Code Online (Sandbox Code Playgroud)
放弃return价值.
这是一个static 方法参考.方法引用意味着您Runnable在功能接口定义的方法中引用和执行方法.
对于你想要的行为,你必须这样做
Runnable r = testStatic();
Run Code Online (Sandbox Code Playgroud)
为了扩展Sotirios的回答:
这个说法:
Runnable r = DemoStatic::testStatic;
Run Code Online (Sandbox Code Playgroud)
相当于
Runnable r = new Runnable() {
@Override
public void run() {
DemoStatic.testStatic();
}
}
Run Code Online (Sandbox Code Playgroud)
因此r.run()调用一个方法来调用testStatic()返回一个新的 Runnable,但后来不做任何事情.
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |