webentwicklung-frage-antwort-db.com.de

Welche Vorteile bietet die Verwendung von Lambda-Ausdrücken in Java 8?

Interface AccountService{
    public void createAccount();
}

AccountService accountServiceAnonymous = new AccountService(){
    public void createAccount(){
        Account account = new Account();
        save(account);
    }
};

AccountService accountServiceLambda = () -> {
    Account account = new Account();
    save(account);
}

Gibt es neben der reduzierten Anzahl von Codezeilen noch weitere Vorteile bei der Verwendung von Lambda-Ausdrücken in Java 8?

14
Prasad Revanaki

Hinzufügen zu dem, was @Bilbo in Kommentaren erwähnt hat. In Java 1.7 wurde ein neuer JVM-Opcode namens invokedynamic veröffentlicht, und Java 8 Lambda verwendet diesen. Der folgende Code führt also dazu, dass eine anonyme Klasse erstellt wird, wenn Sie den Code kompilieren. Möglicher <ClassName>$1.class Wenn Sie also 10 anonyme Klassen haben, sind es 10 weitere Klassen in der letzten Dose.

AccountService accountServiceAnonymous = new AccountService(){
    public void createAccount(){
        Account account = new Account();
        save(account);
    }
};

Java 8-Lambda verwendet jedoch invokedynamic, um Lambdas aufzurufen. Wenn Sie also 10 Lambdas haben, führt dies nicht zu anonymen Klassen, wodurch die endgültige Jar-Größe reduziert wird.

AccountService accountServiceLambda = () -> {
    Account account = new Account();
    save(account);
}
17
shazin

Ein weiterer Vorteil von Lambdas (und Methodenreferenzen) wird sichtbar, wenn Sie sie mit der Stream-API und anderen in Java 8 hinzugefügten Funktionen, z. Wahlweise.

Betrachten Sie diesen Code: 

private void pushToFront(AbstractInfo contactInfo) {
        registeredWindows.stream()
            .filter(window -> window.getWindowId() == contactInfo.getId())
            .findAny()
            .ifPresent(Window::pushToFront);
    }

Die Methode filtert die Liste der registrierten Fenster, die der windowId entsprechen, wobei die ID des Kontakts eine Option zurückgibt. Wenn die Liste ein Fenster mit einer übereinstimmenden ID enthält, ist der Wert in Optional vorhanden, und die PushToFront-Methode steht darauf. Vergleichen Sie dies mit der gleichen Funktionalität, die jedoch in Java 7 geschrieben ist:

private void pushToFront(AbstractInfo contactInfo) {
    for (Window window : registeredWindows) {
        if (window.getWindowId() == contactInfo.getId() {
            window.pushToFront();
        }
    }
}

Der Code mit Lambda-Ausdruck, Stream und Methodenreferenz ist, zumindest für mich, übersichtlicher und lesbarer (wenn Sie sich an die Verwendung von Streams gewöhnen). Das obige Beispiel ist recht simpel - betrachten Sie jedoch eines, bei dem in Java 7 geschachtelte Schleifen, mehrere bedingte Anweisungen usw. erforderlich sind. 

Lambdas ermöglichen es dann, andere Funktionen des Java 8 vollständig zu nutzen, was unter anderem zu sauberem, sauberem, effizientem und leicht verständlichem Code führt.

Unter dem Strich sollten Sie Lambda-Ausdrücke als Teil eines größeren Ganzen betrachten, das für sich selbst großartig ist, aber in Kombination mit anderen "Bausteinen" von Java 8 noch besser ist.

6
ttarczynski

Eine weitere - im Gegensatz zu anonymen Klassen erstellen Lambdas KEINEN neuen Gültigkeitsbereich, sie haben denselben Gültigkeitsbereich wie der umgebende Block/die umgebende Umgebung. 

So:

  1. Es ist einfacher, auf das umgebende Objekt zuzugreifen - plain this verweist auf die Instanz der umgebenden Klasse (und Sie müssen nicht EnclosingClass.this sagen).

  2. Es gibt keine shadowing -Probleme (da Sie keine lokalen Variablen mit denselben Namen wie Variablen im umschließenden Bereich definieren können)

4
Ashutosh A

Vorteile von Lambda-Ausdrücken

  1. Es reduziert die Codezeilen.
  2. Es unterstützt die sequentielle und parallele Ausführung, indem das Verhalten in Methoden Mit der Collection Stream API übergeben wird.
  3. Durch Verwendung von Stream-API und Lambda-Ausdruck können wir eine höhere Effizienz (parallele Ausführung) für Massenvorgänge bei Sammlungen erreichen. 
2
Anand Sinha

Neben dem, was hier gesagt wurde, und um die aufgeworfene Frage strikt zu beantworten, ist es wichtig, Lambdas als "Codeblock" zu betrachten, der unter anderem als Parameter übergeben werden kann. Dies bietet einen großen Vorteil, da Sie duplizierten Code entfernen können. 

Wie ist das ? Im obigen Beispiel von @Kitke könnte die Methode pushToFront (...), falls die Anforderung vorhanden ist, ein wenig als Vorlage umgestaltet und zum Filtern von RegisteredWindows nach any condition . Der Lambda-Ausdruck window -> window.getWindowId () == contactInfo.getId () kann in diesem Fall als Parameter übergeben werden. Ohne diese leistungsstarke Funktion müssen Sie die Schleife while jedes Mal schreiben, wenn Sie die Sammlung registeredWindows nach einer anderen Bedingung filtern müssen. Riesiger Gewinn, überdenken Sie Ihren Code in diesem Sinne.

Extrahiert aus: http://www.copypasteisforword.com/notes/lambda-expressions-in-Java . Dort finden Sie ein weiteres Beispiel für die Verwendung von Lambda, um doppelten Code zu entfernen.

0