当前位置:  开发笔记 > 编程语言 > 正文

如何从Java8 lambda创建Runnable

如何解决《如何从Java8lambda创建Runnable》经验,为你挑选了1个好方法。

我遇到了一些代码,尽管有点阅读,但我仍然难以理解.调用一个方法,该方法接收两个args,其中一个是Runnable.而不是传入一个Runnable对象虽然有一个lambda.

例如:

public class LambdaTest {

    private final Lock lock = new ReentrantLock();

    @Test
    public void createRunnableFromLambda() {
        Locker.runLocked(lock, () -> {
            System.out.println("hello world");
        });
    }

    public static class Locker {
        public static void runLocked(Lock lock, Runnable block) {
            lock.lock();
            try {
                block.run();
            } finally {
                lock.unlock();
            }
        }
    }
}

所以我的问题是,你能解释一下如何从lambda创建Runnable,还请有人解释语法() - > {}.具体来说,()括号是什么意思?

谢谢.



1> Pedro Affons..:

Lambda可用于需要功能接口的任何地方.功能接口是具有单个抽象方法的任何接口.

在这种情况下使用的lambda语法是(arguments) -> {blockOfCodeOrExpression}.在单个参数的情况下可以省略括号,并且在单个命令或表达式的情况下可以省略括号.

换句话说,() -> System.out.println("hello world");等同于*

 new Runnable(){      
   @Override
   public void run(){
     System.out.println("Hello world one!");
   }
 };

(我很确定它不是字节码等价的,但在功能方面是等效的)


功能接口是具有单个**abstract**方法的任何接口.由于`interface`现在可能包含`static`或`default`方法,因此这种差异很重要.更具体地说,功能接口只有一个`abstract`方法,它不会覆盖`java.lang.Object`的方法.因此,[`Comparator`](https://docs.oracle.com/javase/8/docs/api/?java/util/Comparator.html)是一个功能界面,尽管有两个`abstract`方法,因为一个覆盖了`java.lang.Object`的方法`boolean equals(Object obj)`.它有很多非`抽象'的方法......
_almost_等价,但一个重要的区别是如果你在体内使用关键字"this"会发生什么.
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有