Die wertvollste Lernfunktion von Java8 sind Lambda-Ausdrücke. Der folgende Artikel stellt Ihnen die relevanten Informationen zur Verwendung von Lambda-Ausdrücken im Java8-Lernprogramm ausführlich vor Nützlich für das Lernen aller oder Die Arbeit hat einen gewissen Referenz- und Lernwert. Freunde, die sie benötigen, können dem Herausgeber folgen, um gemeinsam zu lernen.
Vorwort
Wir haben im vorherigen Artikel die Syntax von Lambda-Ausdrücken vorgestellt, die Verwendungsszenarien von Lambda-Ausdrücken vorgestellt und die Vorteile der Verwendung von Lambda vorgestellt Ausdrücke. In diesem Artikel erklären wir anhand von Beispielen, wie man Lambda-Ausdrücke definiert und verwendet, sowie die besonderen Spezifikationen von Lambda-Ausdrücken in Java im Vergleich zu anderen Sprachen.
Beispiel für die Verwendung anonymer innerer Klassen
Lassen Sie uns zunächst klarstellen, was Lambda-Ausdrücke vor dem Aufkommen von Java8 bewirken konnten Es ist möglich, innere Klassen zu verwenden, und Lambda-Ausdrücke vereinfachen lediglich die Programmierung.
Im folgenden Beispiel werden Leser anhand von Bedingungen aus einer Liste ausgewählt.
TantanitReader definieren:
public class TantanitReader { private int age; private String loginName; private String realName; private String career; public TantanitReader() { } public TantanitReader(int age, String loginName, String realName, String career) { this.age = age; this.loginName = loginName; this.realName = realName; this.career = career; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public String getCareer() { return career; } public void setCareer(String career) { this.career = career; } @Override public String toString() { return "age:"+this.getAge()+",loginName:"+this.loginName +",realName:"+this.getRealName()+",career:"+this.getCareer(); } }
Beurteilungsschnittstelle definieren:
public interface Predicate<T> { boolean test(T t); }
Definieren Sie die Auswahlfunktion:
public class SelectService<T> { public List<T> select(Collection<T> source, Predicate<T> predicate){ List result = new LinkedList(); for(T element:source){ if (predicate.test(element)) { result.add(element); } } return result; } }
Schreiben Sie ein Beispiel zum Testen, indem Sie erwachsene Leser und Leser im Teenageralter (einschließlich 10 Jahre alt) auswählen:
public class TantanitReaderPredicateTest { public static void main(String[] args) { SelectService tantanitReaderSelectSerive =new SelectService<TantanitReader>(); List<TantanitReader> source = new LinkedList<>(); source.add(new TantanitReader(10,"jack","张三","学生")); source.add(new TantanitReader(18,"rose","李四","学生")); source.add(new TantanitReader(19,"mike","王五","程序员")); source.add(new TantanitReader(20,"jack","赵六","作家")); List<TantanitReader> audultReaders =tantanitReaderSelectSerive.select(source, new Predicate() { @Override public boolean test(Object o) { TantanitReader tantanitReader=(TantanitReader)o; return tantanitReader.getAge()>=18; } }); System.out.println("tantanit.com 成年读者名单如下:"); printTantanitReaders(audultReaders); System.out.println("tantanit.com 十多岁(包含 10 岁)成员如下:"); List<TantanitReader> teenReaders =tantanitReaderSelectSerive.select(source, new Predicate() { @Override public boolean test(Object o) { TantanitReader tantanitReader=(TantanitReader)o; return tantanitReader.getAge()>=10 && tantanitReader.getAge()<=19; } }); printTantanitReaders(teenReaders); } public static void printTantanitReaders(List<TantanitReader> tantanitReaders) { for (TantanitReader tantanitReader : tantanitReaders) { System.out.println(tantanitReader.toString()); } } }
Nach der Ausführung sieht das Druckergebnis wie folgt aus:
tantanit.com 成员读者名单如下: age:18,loginName:rose,realName: 李四,career: 学生 age:19,loginName:mike,realName: 王五,career: 程序员 age:20,loginName:jack,realName: 赵六,career: 作家 tantanit.com 十多岁(包含10 岁)成员如下: age:10,loginName:jack,realName: 张三,career: 学生 age:18,loginName:rose,realName: 李四,career: 学生 age:19,loginName:mike,realName: 王五,career: 程序员
Wie Sie sehen können , es gibt zwei Auswahlmöglichkeiten. Leser benötigen new Predicate() und überschreiben die Testmethode. Der eigentliche Unterschied besteht eigentlich nur in den Urteilsaussagen:
tantanitReader.getAge()>=18
und
tantanitReader.getAge()>=10 && tantanitReader.getAge()<=19
Aber vor Java8 konnten wir diese Redundanz nur tolerieren, da es keine Lambda-Ausdrücke gab. Wie verwende ich Lambda-Ausdrücke, um Code zu vereinfachen?
Um den bestehenden Programmiergewohnheiten von Java-Entwicklern Rechnung zu tragen, schreibt Java8 im Gegensatz zu anderen Sprachen vor, dass beim Entwerfen des Verwendungsmechanismus von Lambda-Ausdrücken weiterhin Schnittstellen verwendet werden müssen und die verwendete Schnittstelle funktional sein muss Schnittstelle, in diesem Beispiel können wir immer noch verwenden:
public interface Predicate<T> { boolean test(T t); }
Da diese Schnittstelle nur eine abstrakte Methode hat (Java8 hat die Standardmethode eingeführt, die Standardmethode hat eine spezifische Implementierung, zählt nicht als abstrakte Methode), es handelt sich also um eine funktionale Schnittstelle. Funktionale Schnittstellen können mit @FunctionalInterface deklariert werden oder nicht. Nach dem Hinzufügen prüft der Compiler jedoch während der Kompilierungsphase, ob die Schnittstelle der Definition einer funktionalen Schnittstelle entspricht. Daher definieren wir hier eine neue Schnittstelle und fügen die @FunctionalInterface-Deklaration hinzu:
@FunctionalInterface public interface PredicateFunction<T> { boolean test(T t); }
Und fügen Sie SelectService eine Methode mit PredicateFunction als Parameter hinzu:
public List<T> select(Collection<T> source, PredicateFunction<T> predicate){ List result = new LinkedList(); for(T element:source){ if (predicate.test(element)) { result.add(element); } } return result; }
Ändern Sie das Testbeispiel:
public class TantanitReaderPredicateFunctionTest { public static void main(String[] args) { SelectService tantanitReaderSelectSerive =new SelectService(); List source = new LinkedList<>(); source.add(new TantanitReader(10,"jack","张三","学生")); source.add(new TantanitReader(18,"rose","李四","学生")); source.add(new TantanitReader(19,"mike","王五","程序员")); source.add(new TantanitReader(20,"jack","赵六","作家")); PredicateFunction predicateFunction = (TantanitReader tantanitReader) -> tantanitReader.getAge() >= 18; List audultReaders =tantanitReaderSelectSerive.select(source,predicateFunction); System.out.println("tantanit.com 成员读者名单如下:"); printTantanitReaders(audultReaders); System.out.println("tantanit.com 十多岁(包含 10 岁)成员如下:"); PredicateFunction predicateFunction2 = (TantanitReader tantanitReader) -> tantanitReader.getAge()>=10 && tantanitReader.getAge()<=19; List teenReaders =tantanitReaderSelectSerive.select(source,predicateFunction2); printTantanitReaders(teenReaders); } public static void printTantanitReaders(List tantanitReaders) { for (TantanitReader tantanitReader : tantanitReaders) { System.out.println(tantanitReader.toString()); } } }
Lassen Sie uns analysieren, wie dieser Code funktioniert:
PredicateFunction<TantanitReader> predicateFunction = (TantanitReader tantanitReader) -> tantanitReader.getAge() >= 18; List<TantanitReader> audultReaders =tantanitReaderSelectSerive.select(source,predicateFunction);
Dieser Code generiert eine Instanz vom Typ PredicateFunction und übergibt die Referenz der Instanz als Parameter zur Auswahlmethode von tantanitReaderSelectSerive hinzufügen und die Auswahlmethode ausführen. Während der Ausführung von select wird die Testmethode von predicateFunction aufgerufen und der Inhalt der Testmethode ist der von uns übergebene Lambda-Ausdruck. Schließlich wird der Leser gemäß dem Lambda-Ausdruck ausgewählt.
Um noch einen Schritt weiter zu gehen, können Sie im Allgemeinen nicht die Variable predicateFunction definieren, sondern den Lambda-Ausdruck direkt als Parameter an die Auswahlmethode von tantanitReaderSelectSerive übergeben, wie folgt:
List<TantanitReader> audultReaders =tantanitReaderSelectSerive.select( source,(TantanitReader tantanitReader) -> tantanitReader.getAge() >= 18 );
In diesem Beispiel wird jedoch tatsächlich ein Kompilierungsfehler gemeldet, der besagt, dass die Definitionen der Auswahlmethoden von TantanitReader und tantanitReaderSelectSerive nicht übereinstimmen, da die Auswahlmethode Generika verwendet. Die Java 8-Dokumentation legt fest, dass bei der Verwendung von Generika Lambda-Ausdrücke nicht direkt als Parameter verwendet werden können. Das ist ziemlich peinlich. Wenn Sie keine Generika verwenden, tritt dieses Problem nicht auf.
Zusammenfassung
Im Folgenden wird zusammengefasst, wie Lambda-Ausdrücke verwendet werden
Definieren Sie zunächst eine Funktion Funktionsschnittstelle und definieren Sie die abstrakten Methoden, die in der Schnittstelle verwendet werden müssen.
Schreiben Sie eine Geschäftsmethode, nehmen Sie die Funktionsschnittstelle als Parameter und rufen Sie die von der Schnittstelle definierte Methode auf, um die Geschäftslogik zu vervollständigen.
Rufen Sie die Geschäftsmethode auf und übergeben Sie den Lambda-Ausdruck als Parameter.
Wenn Generics verwendet werden, besteht der letzte Schritt darin, zunächst eine Referenz auf eine Instanz der funktionalen Schnittstelle zu definieren und diese dann als Parameter an die Geschäftsmethode zu übergeben.
Darüber hinaus können Lambda-Ausdrücke weiterhin zu Funktionsreferenzen vereinfacht werden, was in einem späteren Artikel erläutert wird.
Zusammenfassung
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Lambda-Ausdrücke in Java8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!