lon*_*oud 22 java lambda java-8
我有以下代码:
public class RefDemo {
static class Demo implements Runnable {
public Demo() {
System.out.println(this.toString() + "-----");
}
@Override
public void run() {
System.out.println("run");
}
}
public static void main(String[] args) {
Runnable runnable = Demo::new; // lambda ref constructor method
runnable.run(); // does not do anything
System.out.println(runnable);
Runnable demo = new Demo(); // using new to create a Demo instance
demo.run();
System.out.println(demo);
}
}
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
RefDemo$Demo@7291c18f----- // lambda run constructor method print
RefDemo$$Lambda$1/793589513@34a245ab // main method print
RefDemo$Demo@7cc355be-----
run
RefDemo$Demo@7cc355be
Run Code Online (Sandbox Code Playgroud)
我不知道run调用时代码为什么不打印runnable.run();
为什么会这样?
Tom*_*mVW 40
这段代码
Runnable runnable = Demo::new;
Run Code Online (Sandbox Code Playgroud)
相当于这段代码
Runnable runnable = new Runnable() {
@Override
public void run() {
new Demo();
}
};
Run Code Online (Sandbox Code Playgroud)
所以你不是指构造函数的run方法Demo.
luk*_*302 20
你只是Runnable在太多的地方使用并且让自己感到困惑.以下代码使发生的事情更加清晰:
public class RefDemo {
static class Demo {
public Demo() {
System.out.println(this.toString() + "-----");
}
public void something() {
System.out.println("something");
}
}
public static void main(String[] args) {
Runnable runnable = Demo::new;
runnable.run();
System.out.println(runnable);
Demo demo = new Demo();
demo.something();
System.out.println(demo);
}
}
Run Code Online (Sandbox Code Playgroud)
Runnable runnable = Demo::new;意味着你现在有一个对构造函数的引用Demo(在删除与Runnable接口的一致性后仍然有效).并且您将该引用存储在类型的变量中,该变量Runnable仅在其功能接口兼容的情况下起作用.调用run上的参考,然后简单地调用构造函数,不是的run/ something的方法 Demo.
Ole*_*hov 11
线条:
Runnable runnable = Demo::new;
runnable.run();
Run Code Online (Sandbox Code Playgroud)
相当于:
Runnable runnable = new Runnable() {
@Override
public void run() {
new Demo(); // Creates an instance of the Demo class, and nothing more
}
};
runnable.run();
Run Code Online (Sandbox Code Playgroud)
同时,您的目的是通过方法引用run从Demo类中调用该方法.因此,我认为您的意思如下:
Runnable runnable = new Demo()::run;
runnable.run();
// But, this is a little bit redundant...
Run Code Online (Sandbox Code Playgroud)
上面的代码相当于:
Demo demo = new Demo();
Runnable runnable = new Runnable() {
@Override
public void run() {
demo.run();
}
};
runnable.run();
Run Code Online (Sandbox Code Playgroud)
PS你这里真的不需要方法参考,所以只需写:
new Demo().run();
Run Code Online (Sandbox Code Playgroud)
要么:
Runnable demo = new Demo();
demo.run();
Run Code Online (Sandbox Code Playgroud)
Demo::new是Demo类的构造函数.由于您将其分配给对Runnable接口的引用,因此调用将runnable.run()调用构造函数并创建新Demo实例.该run()方法未执行.
如果要定义一个Runnable调用实例Demo的run()使用方法的参考方法,你可以这样写:
Runnable runnable = new Demo()::run;
Run Code Online (Sandbox Code Playgroud)
当然,既然Demo已经实现了Runnable,那么编写它就简单得多了:
Runnable runnable = new Demo();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3044 次 |
| 最近记录: |