Java lambda方法和新的Object

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)

同时,您的目的是通过方法引用runDemo类中调用该方法.因此,我认为您的意思如下:

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)


Era*_*ran 6

Demo::newDemo类的构造函数.由于您将其分配给对Runnable接口的引用,因此调用将runnable.run()调用构造函数并创建新Demo实例.该run()方法未执行.

如果要定义一个Runnable调用实例Demorun()使用方法的参考方法,你可以这样写:

Runnable runnable = new Demo()::run;
Run Code Online (Sandbox Code Playgroud)

当然,既然Demo已经实现了Runnable,那么编写它就简单得多了:

Runnable runnable = new Demo();
Run Code Online (Sandbox Code Playgroud)