无法弄清楚行为:使用lambda的方法引用

时间:2014-04-11 21:31:25

标签: 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()方法返回的Runnable实例的

testStatic方法。 控制台上的输出应该是"运行"。

但是这段代码没有调用实例run()的{​​{1}}方法,也没有在控制台中打印任何内容。

有人可以解释原因。

如果我没有使用方法参考" ::"并发表评论正常。

2 个答案:

答案 0 :(得分:5)

Runnable r = DemoStatic::testStatic;

返回Runnable,其run()方法包含方法testStatic()的正文,即

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

所以

r.run();

基本上执行

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

删除return值。

它是static method reference。方法引用意味着您的Runnable正在引用并执行功能接口定义的方法中的方法。


对于您想要的行为,您必须

Runnable r = testStatic();

答案 1 :(得分:5)

进一步扩展Sotirios'回答:

本声明:

Runnable r = DemoStatic::testStatic;

相当于

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

因此r.run()调用一个方法来调用testStatic()以返回 Runnable,但之后不做任何操作。