摸不清行为:方法与参考拉姆达(Unable to figure out behaviour : Me

2019-10-19 20:38发布

考虑下面的代码,

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()的方法Runnable正在被返回的实例testStatic本来方法被调用。 并在控制台输出应该是“运行”。

但是这个代码不调用run()实例的方法r是越来越打印控制台并没有什么。

可有一个人请说明理由。

和评论,如果我不使用方法参考“::”正确。

Answer 1:

为了扩大索蒂里奥斯的回答一下:

这个说法:

Runnable r = DemoStatic::testStatic;

相当于

Runnable r = new Runnable() {
    @Override
    public void run() {
        DemoStatic.testStatic();
    }
}

所以r.run()调用调用一个方法testStatic()返回一个 Runnable ,但当时确实与它无关。



Answer 2:

这个

Runnable r = DemoStatic::testStatic;

返回一个Runnablerun()方法包含方法的主体testStatic()即。

public static Runnable testStatic() {
    return () -> {
        System.out.println("Run");
    };
}   

所以

r.run();

主要执行

return () -> {
    System.out.println("Run");
};

丢弃return值。

这是一个static 方法的参考 。 一种方法,参考意味着你的Runnable所引用并执行该功能的接口定义的方法中的方法。


你想要的行为,你必须做

Runnable r = testStatic();


文章来源: Unable to figure out behaviour : Method reference with lambda