Können Lambda-Ausdrücke anders als das Speichern von Codezeilen verwendet werden?
Tun lambda-Ausdrücke haben eine andere Verwendung als die Einsparung Zeilen code?
Gibt es spezielle Funktionen durch Lambda-Ausdrücke, die Probleme gelöst, die nicht einfach zu lösen? Die typische Verwendung, die ich gesehen habe ist, dass statt zu schreiben:
Comparator<Developer> byName = new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
};
Können wir mit einem lambda-Ausdruck zur Verkürzung der code:
Comparator<Developer> byName =
(Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());
InformationsquelleAutor der Frage Vikash | 2017-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lambda-Ausdrücke ändern sich nicht, die Probleme, die Sie lösen können mit Java im Allgemeine, aber auf jeden Fall machen, die Lösung bestimmter Probleme zu erleichtern, genau aus dem gleichen Grund, wir sind nicht die Programmierung in Assembler-Sprache mehr. Entfernen von redundanten Aufgaben, die dem Programmierer die Arbeit macht das Leben leichter und ermöglicht es, Dinge zu tun, die man nicht mal berühren, sonst nur für die Menge an code, den Sie haben, zu produzieren (manuell).
Aber auch lambda-Ausdrücke sind, spart nicht nur code-Zeilen. Lambda-Ausdrücke können Sie festlegen Funktionenwas, die Sie konnte Verwendung von anonymen inneren Klassen als workaround vor, das ist, warum Sie ersetzen kann anonyme innere Klassen in diesen Fällen, aber nicht im Allgemeinen.
Insbesondere lambda-Ausdrücke sind unabhängig definiert die funktionale Schnittstelle, die Sie umgewandelt werden, so gibt es keine geerbten Mitglieder, die Sie zugreifen können, weiter können Sie nicht den Zugriff auf die Instanz des Typs der Umsetzung der funktionalen Schnittstelle. Innerhalb eines lambda-Ausdrucks,
this
undsuper
haben die gleiche Bedeutung wie in den umgebenden Rahmen, siehe auch diese Antwort. Auch, Sie können nicht erstellen Sie neue lokale Variablen shadowing lokale Variablen des umgebenden Kontexts. Für die beabsichtigte Aufgabe der Definition einer Funktion, dies beseitigt zahlreiche Fehler-Quellen, aber es bedeutet auch, dass für andere Anwendungsfälle, könnte es sein, anonyme innere Klassen, die nicht konvertiert werden, um einen lambda-Ausdruck, selbst wenn die Implementierung einer funktionalen Schnittstelle.Weiter, das Konstrukt
new Type() { … }
garantiert, um zu produzieren, eine neue unterschiedliche Instanz (wienew
immer tut). Anonyme innere Klassen-Instanzen immer ein Verweis auf Ihre äußere Instanz, wenn Sie in einem nicht-static
Kontext. Im Gegensatz lambda-Ausdrücke erfassen nur einen Verweis aufthis
bei Bedarf, D. H. wenn Sie Zugangthis
oder eine nicht-static
Mitglied. Und Sie produzieren Instanzen von einem absichtlich unbestimmten Identität, die es erlaubt, die Umsetzung zu entscheiden, zur Laufzeit, ob die Wiederverwendung bestehender Instanzen (siehe auch "Hat ein lambda-Ausdruck erstellen eines Objekts auf dem heap jedes mal, wenn es ausgeführt wird?").Diese Unterschiede gelten zu deinem Beispiel. Ihre anonyme innere Klasse erstellen, wird immer eine neue Instanz, kann es auch erfassen eine Referenz auf die äußere Instanz, in der Erwägung, dass Ihre
(Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
ist eine nicht-Erfassung von lambda-Ausdruck bewertet, um einen singleton in typischen Implementierungen. Weiter produziert er nicht ein.class
- Datei auf Ihrer Festplatte.Angesichts der Unterschiede in Bezug auf beide, semantische und performance, lambda-Ausdrücke können sich ändern die Weise, die Programmierer bestimmte Probleme zu lösen, die in der Zukunft, natürlich, auch aufgrund der neuen APIs umarmt Ideen der funktionalen Programmierung die Nutzung der neuen Funktionen der Sprache. Siehe auch Java 8 lambda-Ausdrücken und first-class-Werte.
InformationsquelleAutor der Antwort Holger
Programmiersprachen sind nicht für Maschinen ausführen.
Sind Sie für Programmierer denke.
Sprachen sind ein Gespräch mit einem compiler, um unsere Gedanken in etwas, das eine Maschine ausführen kann. Eine der wichtigsten Beschwerden über Java von Menschen, die kommen, um es von anderen Sprachen (oder verlassen es für anderen Sprachen) verwendet werden, dass es Kräfte einen bestimmten mentalen Modells, auf die der Programmierer (d.h. alles ist eine Klasse).
Werde ich nicht kommentieren ob das gut oder schlecht ist: alles ist ein " trade-offs. Aber Java 8 Lambda-Ausdrücke können Programmierer denke in Bezug auf Funktionendas ist etwas, was Sie vorher nicht tun konnte, in Java.
Es ist die gleiche Sache wie ein prozeduraler Programmierer lernen denke in Bezug auf die Klassen, wenn Sie kommen, um Java: Sie sehen, wie Sie sich allmählich verschieben von Klassen, die in verherrlicht Strukturen und 'Helfer' - Klasse mit ein paar statischen Methoden und die Bewegung zu etwas, das ähnelt eher einen rational-OO design (mea culpa).
Wenn Sie nur von Ihnen denken, als der kürzere Weg, um auszudrücken, anonyme innere Klassen, dann sind Sie wahrscheinlich nicht gehen, um Sie zu finden, sehr eindrucksvoll in der gleichen Weise, dass die prozedurale Programmierer oben wahrscheinlich gar nicht, dass Klassen waren keine große Verbesserung.
InformationsquelleAutor der Antwort Jared Smith
Speichern von code-Zeilen angezeigt werden können, wie ein neues feature, wenn es ermöglicht Ihnen zu schreiben, die einen erheblichen Teil der Logik in eine kürzere und klarere Art und Weise, die weniger Zeit in Anspruch nimmt, für andere zu Lesen und zu verstehen.
Ohne lambda-Ausdrücken (und/oder Methode Referenzen)
Stream
pipelines hätten viel weniger lesbar.Denken Sie zum Beispiel, wie die folgenden
Stream
- pipeline hätte das ausgesehen, wenn Sie ersetzt jede lambda-Ausdruck, der eine anonyme Instanz der Klasse.Wäre es:
Dies ist viel schwieriger zu schreiben als die version mit lambda-Ausdrücke, und es ist viel mehr fehleranfällig. Es ist auch schwieriger zu verstehen.
- Und das ist eine relativ kurze pipeline.
Um diese lesbar, ohne lambda expressions und method references, Sie hätte zu definieren, die Variablen, die die verschiedenen funktionalen interface Instanzen hier, die würde geteilt haben, die Logik der pipeline, so dass es schwieriger zu verstehen.
InformationsquelleAutor der Antwort Eran
Interne iteration
Bei der Iteration Java-Collections, die meisten Entwickler neigen dazu, bekommen ein element und dann Prozess. Dies ist, nehmen Sie das Element aus und dann verwenden Sie es, oder legen Sie Sie wieder ein, usw. Mit pre-8-Versionen von Java für die Implementierung einer inneren Klasse und tun Sie etwas wie:
Nun mit Java 8 können Sie tun, besser und weniger ausführlich, mit:
oder besser
Verhaltensweisen, die als Argumente
Denke mal der folgende Fall:
Mit Java 8 Prädikat-Schnittstelle Sie besser machen können, etwa so:
Nennen es wie:
Quelle: DZone - Warum Brauchen Wir Lambda-Ausdrücke in Java
InformationsquelleAutor der Antwort alseether
Es gibt viele Vorteile der Verwendung von Lambda-Ausdrücke statt der inneren Klasse folgenden als unten:
Den code kompakter und ausdrucksstark, ohne dabei mehr Sprache, syntax, Semantik. Sie gab bereits ein Beispiel in deiner Frage.
Durch die Verwendung von lambdas sind Sie glücklich in die Programmierung mit funktionalen Stil Operationen auf streams von Elementen, wie map-reduce-Transformationen, die auf Sammlungen. sehen java.util.Funktion & java.util.stream Pakete Dokumentation.
Gibt es keine physische Klassen-Datei generiert, die für Lambda-Ausdrücke vom compiler. So macht es Ihr gelieferten Anwendungen kleiner. Wie Speicher zuweist, lambda?
Den compiler optimieren lambda erstellen, wenn die lambda nicht auf Variablen aus, den Geltungsbereich, das heißt der lambda-Instanz nur einmal erstellen, indem Sie die JVM. für mehr details können Sie sehen, @Holger die Antwort auf die Frage Ist die Methode Referenz Zwischenspeichern eine gute Idee in Java 8?
.
Lambdas können implementiert multi-marker-interfaces neben der funktionalen Schnittstelle, aber die anonyme innere Klassen nicht implementiert mehrere Schnittstellen, zum Beispiel:
InformationsquelleAutor der Antwort holi-java
Ihre Frage zu beantworten, die in der Tat ist lambdas nicht lassen, Sie tun alles, was Sie nicht tun konnte, vor der java-8, sondern ermöglicht es Ihnen, mehr zu schreiben prägnant code. Die Vorteile dieser ist, dass sich dein code wird übersichtlicher und flexibler.
InformationsquelleAutor der Antwort Aominè
Eine Sache, die ich nicht sehen, noch erwähnt wird, dass ein lambda - können Sie definieren Funktionen, wo es verwendet.
So, wenn Sie einige einfache Auswahl-Funktion, die Sie nicht brauchen, um es in einem separaten Raum mit einem Haufen von boilerplate, das Sie gerade schreiben ein lambda-Ausdruck ist prägnant und lokal relevanten.
InformationsquelleAutor der Antwort Carlos
Ja viele Vorteile hat.
InformationsquelleAutor der Antwort Sunil Kanjar
Lambdas sind nur syntaktischer Zucker für anonyme Klassen.
Bevor Lambda-Ausdrücke, anonyme Klassen verwendet werden können, das gleiche zu erreichen. Jeder lambda-Ausdruck umgewandelt werden können, um eine anonyme Klasse.
Wenn Sie mit IntelliJ IDEA, es kann die Konvertierung für Sie tun:
InformationsquelleAutor der Antwort Sweeper