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

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也没有任何东西在控制台中打印出来.

有人可以解释原因.

如果我没有正确使用方法参考"::",请评论.

Sot*_*lis 5

这个

Runnable r = DemoStatic::testStatic;
Run Code Online (Sandbox Code Playgroud)

返回Runnablerun()方法中包含的方法体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)


ajb*_*ajb 5

为了扩展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,但后来不做任何事情.

  • 是的,这是一种更好的可视化方式.+1 (2认同)