Как Runnable создается из Java8 lambda

Я столкнулся с некоторым кодом, который я пытаюсь понять, несмотря на чтение. Существует вызов метода, который принимает два аргумента, один из которых является Runnable. Вместо того, чтобы проходить через объект Runnable, хотя есть лямбда.

Например:

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();
            }
        }
    }
}

Поэтому мой вопрос: можете ли вы объяснить, как Runnable создается из лямбда, а также, пожалуйста, кто-нибудь может объяснить синтаксис () → {}. В частности, что означают скобки()?

Благодарю.

Ответ 1

Лямбда может использоваться в любом месте, где требуется функциональный интерфейс. Функциональный интерфейс - это любой интерфейс с одним абстрактным методом.

В этом случае используется лямбда-синтаксис (arguments) → {blockOfCodeOrExpression}. Круглые скобки могут быть опущены в случае одного аргумента, а фигурные скобки могут быть опущены в случае одной команды или выражения.

Другими словами, () → System.out.println("hello world"); эквивалентно * здесь, где ожидается, что Runnable

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

* (Я уверен, что он не эквивалентен байт-коду, но эквивалентен с точки зрения функциональности)