Ich werde einen Kommentar zu Java-Lambda-Ausdrücken schreiben.
Erstens werden Lambda-Ausdrücke häufig in funktionalen Sprachen verwendet, um anonyme Funktionen zu beschreiben. Es wird beim Erstellen einer temporären Funktion verwendet, z. B. beim Übergeben einer Funktion an eine Funktion.
In Java gibt es keine Funktion (Methoden werden immer in Klassen definiert). Daher verhalten sich Java-Lambda-Ausdrücke wie "Erstellen und Übergeben einer Instanz einer Schnittstelle mit einer einzelnen abstrakten Methode". Es ist auf eine einzelne Methode beschränkt, da ein Lambda-Ausdruck nur einen Ausdruck beschreiben kann und eine Schnittstelle mit mehreren Methoden nicht den Ausdruck der Methode bestimmt.
Als Beschreibungsmethode
(Streit) -> {wird bearbeitet}
Schreiben. Klammern können weggelassen werden, wenn nur ein Argument oder eine Aktion vorhanden ist.
Schauen wir uns als konkretes Beispiel die Sortiermethode "Sammlungen" an.
Dies ist eine Methode, die nach dem ersten Argument "List" sortiert. Wenn Sie jedoch eine Instanz der "Comparator" -Schnittstelle an das zweite Argument übergeben, wird die "vergleichbar" -Methode verwendet, um die Sortierreihenfolge zu bestimmen.
Wenn Sie beispielsweise eine Liste von Zeichenfolgen (strList
) nach Zeichenlänge sortieren möchten, können Sie eine anonyme Funktion wie folgt schreiben.
Collections.sort(strList, new Comparator(){
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
})
Da die "Comparator" -Klasse eine Schnittstelle ist, in der nur die "compare" -Methode ** definiert ist, kann sie mit einem Lambda-Ausdruck wie folgt umgeschrieben werden.
List<String> strList = Arrays.asList("a","ccc","bb");
Collections.sort(strList, (s1, s2) -> s1.length() - s2.length());
System.out.println(strList); // [a, bb, ccc]
Die "Vergleichs" -Methode wird in der "Vergleichs" -Klasse wie folgt definiert.
comparing(Function<? super T,? extends U> keyExtractor);
Der Argumenttyp ist "Funktion <? Super T ,? Erweitert U>", was eine Art ** Funktionsschnittstelle ** ist.
Die Funktionsschnittstelle ist eine Schnittstelle, die Lambda-Ausdrücke verwenden kann, und es stehen verschiedene Typen zur Verfügung.
Dieses Mal gibt Function <? Super T ,? Extends U>
an, dass die Instanz einen Typ mit dem Argument T und dem Rückgabewert U hat.
T und U sind wie folgt definiert:
<T,U extends Comparable<? super U>> Comparator<T>
T ist der Typ der zu vergleichenden Instanz. U ist die Art des zu vergleichenden Feldes. Daher bedeutet diese funktionale Schnittstelle, dass es sich um einen Ausdruck handelt, der Informationen U zum Vergleichen von Instanzen von T zurückgibt.
Wenn Sie die Verarbeitung von "Collections.sort" früher mit der "compare" -Methode schreiben, ist dies wie folgt.
Collections.sort(strList, comparing(s -> s.length()));
Der Teil s-> s.length ()
bedeutet, die Längenmethode der String-Typ-Instanz s aufzurufen, damit sie mit ** Methodenreferenz ** umgeschrieben werden kann.
Eine Methodenreferenz ist eine Beschreibungsmethode, mit der der Aufruf einer Methode dieser Klasse für eine Instanz einfach geschrieben werden kann.
Beschreiben Sie mit class name :: method name
.
Wenn Sie das vorherige Beispiel mit einer Methodenreferenz schreiben, sieht es wie folgt aus.
Collections.sort(strList, comparing(String::length));
Referenz (o1, o2) -> o1 --o2 Stoppt Zauber! - Verwendung von Composer in Java 8 JavaDoc:Comparator
Recommended Posts