Как 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!");
}
};
* (Я уверен, что он не эквивалентен байт-коду, но эквивалентен с точки зрения функциональности)