2015-12-01 18 views
8

Znalazłem kod, który staram się zrozumieć pomimo odrobiny czytania. Jest wołanie do metody, która przyjmuje dwa argumenty, z których jeden jest Runnable. Zamiast przechodzić w obiekcie Runnable, ale istnieje lambda.W jaki sposób można utworzyć Runnable z Java8 lambda

Na przykład:

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

Więc moje pytanie jest, można wyjaśnić, jak Runnable jest tworzony z lambda, a także proszę może ktoś wytłumaczyć składnię () -> {}. W szczególności, co oznaczają nawiasy()?

dzięki.

+3

Mnóstwo przewodników online to. '() -> {}' '()' reprezentuje formalne parametry dla metody zadeklarowanej w interfejsie funkcjonalnym. '{}' jest treścią tej metody. '->' oddziela parametry od treści. –

Odpowiedz

24

Lambda może być używana wszędzie tam, gdzie wymagany jest funkcjonalny interfejs. Funkcjonalny interfejs to dowolny interfejs z jedną abstrakcyjną metodą.

Zastosowana w tym przypadku składnia lambda to (arguments) -> {blockOfCodeOrExpression}. Nawias można pominąć w przypadku pojedynczego argumentu, a nawiasy klamrowe można pominąć w przypadku pojedynczego polecenia lub wyrażenia.

Innymi słowy, () -> System.out.println("hello world"); jest równoważny * do

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

(jestem pewien, że to nie jest kod bajtowy-odpowiednik, ale jest równoważny pod względem funkcjonalności)

+5

Funkcjonalny interfejs to dowolny interfejs z pojedynczą metodą ** abstrakcyjną **. Ponieważ "interfejs" może teraz zawierać "statyczne" lub "domyślne" metody, ta różnica jest ważna. Aby być jeszcze dokładniejszym, interfejs funkcjonalny ma dokładnie jedną "abstrakcyjną" metodę, która nie zastępuje metody 'java.lang.Object'. Tak więc ['Comparator'] (https://docs.oracle.com/javase/8/docs/api/?java/util/Comparator.html) jest funkcjonalnym interfejsem, mimo że dwie" abstrakcyjne "metody są nadpisywane metoda 'boolean equals (Object obj)' 'java.lang.Object'. I ma wiele nie-abstrakcyjnych metod ... – Holger

+0

Dzięki @Pedro Affonso - więc aby odpowiedzieć na moje pytanie, nawiasy() skutecznie mówią, że żadne argumenty nie są przekazywane do bloku kodu. – robjwilkins

+2

_almost_ odpowiednik, ale jedną ważną różnicą jest to, co się stanie, jeśli użyjesz słowa kluczowego "this" w treści. –

Powiązane problemy