Lambda-Ausdrücke Lambda-Ausdrücke, auch Closures genannt, sind die wichtigste neue Funktion, die zur Veröffentlichung von Java 8 geführt hat. 1. BedarfsanalyseErstellen Sie einen neuen Thread und geben Sie die Aufgabe an, die der Thread ausführen soll öffentliche statische void main(String[] args) { // Einen neuen Thread starten neuer Thread(neuer Runnable() { @Überschreiben öffentliche Leere ausführen() { System.out.println("Im neuen Thread ausgeführter Code: "+Thread.currentThread().getName()); } }).Start(); System.out.println("Code im Hauptthread: " + Thread.currentThread().getName()); } Code-Analyse:
2. Lambda-Ausdrücke für AnfängerLambda-Ausdruck ist eine anonyme Funktion, die als Codestück verstanden werden kann, das übergeben werden kann neuer Thread(() -> { System.out.println("Neuer Thread-Lambda-Ausdruck..." +Thread.currentThread().getName()); }) Die Syntax anonymer innerer Klassen ist redundant. Nachdem ich Lambda-Ausdrücke ausprobiert hatte, fand ich heraus, dass Lambda-Ausdrücke eine Möglichkeit sind, anonyme innere Klassen zu vereinfachen. 3. Lambda-SyntaxregelnLambda eliminiert die objektorientierten Regeln und Vorschriften. Das Standardformat von Lambda besteht aus drei Teilen:
Formatbeschreibung:
3.1 Lambda Übung 1Üben Sie Lambda ohne Parameter und ohne Rückgabewert Definieren einer Schnittstelle öffentliche Schnittstelle UserService { ungültig zeigen(); } Erstellen Sie dann die Hauptmethode mit öffentliche Klasse Demo03Lambda { öffentliche statische void main(String[] args) { goShow(neuer Benutzerdienst() { @Überschreiben öffentliche Leere zeigen () { System.out.println("Ausgeführte Methode anzeigen..."); } }); System.out.println("----------"); goShow(() -> { System.out.println("Lambda-Show-Methode ausgeführt..."); }); } öffentliche statische Leere goShow (Benutzerdienst Benutzerdienst) { userService.show(); } } Ausgabe:
3.2 Lambda-Übung 2Vervollständigen Sie einen Lambda-Ausdrucksfall mit Parametern und Rückgabewert Erstellen eines Personenobjekts @Daten @AllArgsKonstruktor @NoArgsConstructor öffentliche Klasse Person { privater String-Name; privates ganzzahliges Alter; private Ganzzahlhöhe; } Anschließend speichern wir mehrere Personenobjekte in der Listensammlung und sortieren diese Objekte anschließend nach Alter. öffentliche statische void main(String[] args) { Liste<Person> Liste = neue ArrayList<>(); Liste.Hinzufügen(neue Person("Jay Chou",33,175)); list.add(neue Person("Andy Lau",43,185)); list.add(new Person("Personen hinzufügen",38,177)); list.add(new Person("Person im Kontext",23,170)); Sammlungen.sort(Liste, neuer Komparator<Person>() { @Überschreiben öffentliche int vergleichen(Person o1, Person o2) { gibt o1.getAge()-o2.getAge() zurück; } }); für (Person Person : Liste) { System.out.println(person); } } Wir haben festgestellt, dass der zweite Parameter der Sortiermethode eine anonyme innere Klasse der Comparator-Schnittstelle ist und die ausgeführte Methode Parameter und Rückgabewerte hat, sodass wir sie als Lambda-Ausdruck umschreiben können öffentliche statische void main(String[] args) { Liste<Person> Liste = neue ArrayList<>(); Liste.Hinzufügen(neue Person("Jay Chou",33,175)); list.add(neue Person("Andy Lau",43,185)); list.add(new Person("Personen hinzufügen",38,177)); list.add(new Person("Person im Kontext",23,170)); /*Collections.sort(Liste, neuer Komparator<Person>() { @Überschreiben öffentliche int vergleichen(Person o1, Person o2) { gibt o1.getAge()-o2.getAge() zurück; } }); für (Person Person : Liste) { System.out.println(person); }*/ System.out.println("------"); Sammlungen.sort(Liste,(Person o1,Person o2) -> { gibt o1.getAge() - o2.getAge() zurück; }); für (Person Person : Liste) { System.out.println(person); } } Ausgabe
4. @FunctionalInterface-Annotation@FunctionalInterface ist eine neue funktionale Annotation, die in JDK8 hinzugefügt wurde und angibt, dass die durch diese Annotation geänderte Schnittstelle nur eine abstrakte Methode haben kann. /** * @FunktionaleSchnittstelle * Dies ist eine funktionale Annotation. Die durch diese Annotation geänderte Schnittstelle kann nur eine abstrakte Methode deklarieren*/ @FunktionaleSchnittstelle öffentliche Schnittstelle UserService { ungültig zeigen(); } 5. Das Prinzip des Lambda-AusdrucksDas Wesentliche einer anonymen inneren Klasse besteht darin, während der Kompilierung eine Klassendatei zu generieren. XXXXX$1.Klasse öffentliche Klasse Demo01Lambda { öffentliche statische void main(String[] args) { // Einen neuen Thread starten neuer Thread(neuer Runnable() { @Überschreiben öffentliche Leere ausführen() { System.out.println("Im neuen Thread ausgeführter Code: "+Thread.currentThread().getName()); } }).Start(); System.out.println("Code im Hauptthread: " + Thread.currentThread().getName()); System.out.println("---------------"); /*neuer Thread(() -> { System.out.println("Neuer Thread-Lambda-Ausdruck..." +Thread.currentThread().getName()); }) .Start();*/ } } Sie können auch das Dekompilierungstool verwenden, um den generierten Code anzuzeigen XJad-Tool zum Anzeigen statische Klasse Demo01Lambda$1 implementiert Runnable { öffentliche void run() { System.out.println((new StringBuilder()).append("Im neuen Thread ausgeführter Code: " ).append(Thread.currentThread().getName()).toString()); } Demo01Lambda$1() { } } Was ist also das Prinzip des Lambda-Ausdrucks? Wir verwenden auch das Dekompilierungstool zur Überprüfung Für Klassendateien mit Lambda-Ausdrücken verwenden wir XJad zur Fehlerprüfung. Derzeit können wir ein mit JDK geliefertes Tool verwenden: javap, um den Bytecode zu disassemblieren. javap -c -p Dateiname.Klasse
Das Ergebnis der Demontage: E:\Arbeitsbereich\OpenClassWorkSpace\JDK8Demo\Ziel\Klassen\com\bobo\jdk\lambda>javap -c -p Demo03Lambda.class Kompiliert aus „Demo03Lambda.java“ öffentliche Klasse com.bobo.jdk.lambda.Demo03Lambda { öffentliche com.bobo.jdk.lambda.Demo03Lambda(); Code: 0: aload_0 1: invokespecial #1 // Methode java/lang/Object."<init>":()V 4: Rückkehr öffentliche statische void main(java.lang.String[]); Code: 0: invokedynamic #2, 0 // InvokeDynamic #0:show:()Lcom/bobo/jdk/lambda/service/UserService; 5: invokestatic #3 // Methode goShow:(Lcom/bobo/jdk/lambda/service/UserService;)V 8: Rückkehr öffentliche statische Leere goShow(com.bobo.jdk.lambda.service.UserService); Code: 0: aload_0 1: invokeinterface #4, 1 // Schnittstellenmethode com/bobo/jdk/lambda/service/UserService.show:()V 6: Rückkehr private statische Leere lambda$main$0(); Code: 0: getstatic #5 // Feld java/lang/System.out:Ljava/io/PrintStream; 3: ldc #6 // String-Lambda-Show-Methode wird ausgeführt … 5: invokevirtual #7 // Methode java/io/PrintStream.println:(Ljava/lang/String;)V 8: Rückkehr } In diesem dekompilierten Quellcode sehen wir eine statische Methode lambda$main$0(). Was macht diese Methode? Lassen Sie es uns durch Debuggen überprüfen: Der obige Effekt kann wie folgt verstanden werden: öffentliche Klasse Demo03Lambda { öffentliche statische void main(String[] args) { .... } private statische Leere lambda$main$0(); System.out.println("Lambda-Show-Methode ausgeführt …"); } } Um dies intuitiver zu verstehen, können wir beim Ausführen -Djdk.internal.lambda.dumpProxyClasses hinzufügen. Durch Hinzufügen dieses Parameters wird der interne Klassencode in eine Datei ausgegeben Befehlsausführung E:\Arbeitsbereich\OpenClassWorkSpace\JDK8Demo\Ziel\Klassen>java -Djdk.internal.lambda.dumpProxyClasses com.bobo.jdk.lambda.Demo03Lambda Dekompilierter Inhalt: Sie können sehen, dass diese anonyme innere Klasse die UserService-Schnittstelle implementiert und die show()-Methode überschreibt. In der Show-Methode wird Demo03Lambda.lambda$main$0() aufgerufen, was bedeutet, dass der Inhalt in Lambda aufgerufen wird. öffentliche Klasse Demo03Lambda { öffentliche statische void main(String[] args) { goShow(neuer Benutzerdienst() { @Überschreiben öffentliche Leere zeigen () { Demo03Lambda.lambda$main$0(); } }); System.out.println("----------"); } öffentliche statische Leere goShow (Benutzerdienst Benutzerdienst) { userService.show(); } private statische Leere lambda$main$0(); System.out.println("Lambda-Show-Methode ausgeführt …"); } } Zusammenfassung: Eine anonyme innere Klasse generiert beim Kompilieren eine Klassendatei. Lambda-Ausdrücke bilden eine Klasse, wenn das Programm ausgeführt wird.
6. Abkürzung des Lambda-AusdrucksBasierend auf der Standardschreibweise von Lambda-Ausdrücken lauten die Regeln für die Verwendung von Auslassungspunkten wie folgt:
öffentliche Klasse Demo05Lambda { öffentliche statische void main(String[] args) { goStudent((Stringname,Integeralter)->{ returniere Name+Alter+" 6666 ..."; }); // Kurzform goStudent((name,age)-> name+age+" 6666 ..."); System.out.println("------"); goOrder((Stringname)->{ System.out.println("--->" + name); Rückgabe 666; }); // Abgekürzte Notation goOrder(name -> { System.out.println("--->" + name); Rückgabe 666; }); goOrder(Name -> 666); } öffentliche statische Leere goStudent (StudentService studentService) { studentService.show("Weiter",22); } öffentliche statische Leere goOrder (OrderService orderService) { orderService.show("Li Si"); } } 7. Voraussetzungen für die Verwendung von Lambda-AusdrückenDie Syntax von Lambda-Ausdrücken ist sehr präzise, aber Lambda-Ausdrücke können nicht beiläufig verwendet werden. Bei ihrer Verwendung gibt es mehrere Bedingungen, die besondere Aufmerksamkeit erfordern.
8. Vergleich zwischen Lambda und anonymen inneren KlassenVergleich zwischen Lambda und anonymen inneren Klassen 1. Die erforderlichen Typen sind unterschiedlich
2. Die Anzahl der abstrakten Methoden ist unterschiedlich
3. Die Umsetzungsprinzipien sind unterschiedlich
Dies ist das Ende dieses Artikels über die Prinzipien und Beispiele von Lambda-Ausdrücken. Weitere Informationen zu Lambda-Ausdrücken finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
>>: Tutorial zur Optimierung der Installationskonfiguration von MySQL 8.0.18
Warum brauchen wir virtuellen Dom? Virtual DOM wu...
IE8 wird mehrere Kompatibilitätsmodi haben. Der IE...
Der erste Cutter in China github.com/chokcoco Hie...
Die Protokollrotation ist eine sehr gängige Funkt...
Inhaltsverzeichnis 1. Vertikales (längsseitiges) ...
In diesem Artikel wird der spezifische Code für R...
Text OK, als nächstes ist es Zeit, die Renderings...
Vorwort Früher habe ich den Cache verwendet, um d...
Inhaltsverzeichnis 2. Bewährte Methoden 2.1 Am Le...
Float: links/rechts/keine; 1. Gleichstufiges Schw...
Die Informationen auf Baidu sind so vielfältig, d...
Nachdem ich React eine Weile studiert habe, möcht...
1) Prozess 2) FSImage und Bearbeitungen Nodenode ...
nginx Übersicht nginx ist ein kostenloser, quello...
Ich habe fast zwei Stunden damit verbracht, versc...