Lambda-Ausdrücke ändern nicht die Probleme, die Sie mit Java im Allgemeinen lösen können, erleichtern jedoch definitiv die Lösung bestimmter Probleme, nur aus dem gleichen Grund, aus dem wir nicht mehr in Assemblersprache programmieren. Das Entfernen redundanter Aufgaben aus der Arbeit des Programmierers erleichtert das Leben und ermöglicht es, Dinge zu tun, die Sie sonst nicht einmal berühren würden, nur für die Menge an Code, die Sie (manuell) produzieren müssten.
Lambda-Ausdrücke speichern jedoch nicht nur Codezeilen. Mit Lambda-Ausdrücken können Sie Funktionen definieren , für die Sie zuvor anonyme innere Klassen als Problemumgehung verwenden konnten. Deshalb können Sie in diesen Fällen anonyme innere Klassen ersetzen, jedoch nicht generell.
Insbesondere werden Lambda-Ausdrücke unabhängig von der Funktionsschnittstelle definiert, in die sie konvertiert werden, sodass keine geerbten Mitglieder vorhanden sind, auf die sie zugreifen können. Außerdem können sie nicht auf die Instanz des Typs zugreifen, der die Funktionsschnittstelle implementiert. Siehe auch diese Antwort innerhalb eines Lambda-Ausdrucks this
und super
mit derselben Bedeutung wie im umgebenden Kontext . Sie können auch keine neuen lokalen Variablen erstellen, die lokale Variablen des umgebenden Kontexts überschatten. Für die beabsichtigte Aufgabe, eine Funktion zu definieren, werden viele Fehlerquellen entfernt, aber es wird auch impliziert, dass es für andere Anwendungsfälle anonyme innere Klassen geben kann, die nicht in einen Lambda-Ausdruck konvertiert werden können, selbst wenn eine funktionale Schnittstelle implementiert wird.
Darüber hinaus new Type() { … }
garantiert das Konstrukt (wie new
immer) , eine neue eindeutige Instanz zu erzeugen . Anonyme Instanzen der inneren Klasse behalten immer einen Verweis auf ihre äußere Instanz, wenn sie in einem Nicht- static
Kontext erstellt werden. Im Gegensatz dazu erfassen Lambda-Ausdrücke nur dann einen Verweis, this
wenn dies erforderlich ist, dh wenn sie darauf zugreifen this
oder nicht static
Mitglied sind. Und sie erzeugen Instanzen einer absichtlich nicht spezifizierten Identität, wodurch die Implementierung zur Laufzeit entscheiden kann, ob vorhandene Instanzen wiederverwendet werden sollen (siehe auch „ Erstellt ein Lambda-Ausdruck bei jeder Ausführung ein Objekt auf dem Heap? “).
Diese Unterschiede gelten für Ihr Beispiel. Ihr anonymes inneres Klassenkonstrukt erzeugt immer eine neue Instanz. Außerdem erfasst es möglicherweise einen Verweis auf die äußere Instanz, während es sich bei Ihrem (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
nicht erfassenden Lambda-Ausdruck um einen Singleton handelt, der in typischen Implementierungen als Singleton ausgewertet wird. Außerdem wird keine .class
Datei auf Ihrer Festplatte erstellt.
Angesichts der Unterschiede sowohl in Bezug auf die Semantik als auch in Bezug auf die Leistung können Lambda-Ausdrücke die Art und Weise verändern, wie Programmierer bestimmte Probleme in Zukunft lösen werden, natürlich auch aufgrund der neuen APIs, die Ideen der funktionalen Programmierung unter Verwendung der neuen Sprachfunktionen enthalten. Siehe auch Java 8 Lambda-Ausdruck und erstklassige Werte .
(o1, o2) -> o1.getName().compareTo(o2.getName())