Übergeben Sie die im Java8-Lambda-Ausdruck filter () verwendeten Bedingungen als Parameter

Lambda-Ausdrücke können Variablen zugewiesen und wiederverwendet werden, ihre Filterbedingungen sind jedoch festgelegt. Java8-Lambda-Ausdruck der Variablen zuweisen und wiederverwenden

Wenn Sie die Filterbedingung ändern möchten, müssen Sie möglicherweise einen separaten Ausdruck definieren. Zum Beispiel Ein Lambda-Ausdruck, der "nur Zeichenfolgen mit einer Länge von 5" filtert. Wenn Sie einen Lambda-Ausdruck möchten, der "nur Zeichenfolgen mit einer Länge von 8" filtert, können Sie zwei Ausdrücke wie folgt definieren:

lengthFiveOrEight


//Die Stringlänge beträgt 5
final Predicate<String> lengthEqualFive = name -> name.length() == 5;
//Die Stringlänge beträgt 8
final Predicate<String> lengthEqualEight = name -> name.length() == 8;

Es ist in Ordnung, wenn die Bedingungen immer festgelegt sind. Wenn die Anwendung jedoch die Flexibilität wünscht, die Bedingungen zu ändern, müssen Sie möglicherweise so viele Ausdrücke definieren, wie vorhanden sind.

Wenn Sie diese Bedingung (in diesem Beispiel 5 oder 8) als Parameter erhalten können, können Sie eine solche Duplizierung vermeiden. Beispielsweise können Sie die folgende Methode definieren.

lengthEqualWith


Predicate<String> lengthEqualWith(final Integer expectsLength) {
  return name -> name.length == expectsLength;
}

Anstatt einer Variablen einfach einen Lambda-Ausdruck zuzuweisen, übergeben Sie ein Argument an eine Methode, die einen Lambda-Ausdruck zurückgibt, und wenden dieses Argument auf den Lambda-Ausdruck an. Durch Übergeben von expectedLength als Parameter beim Aufrufen von lengthEqualWith () können die Bedingungen flexibel geändert werden.

Versuchen Sie, anhand der folgenden Liste zu filtern.

final List<String> months = 
Arrays.asList("January", "February", "March", "April", "May", "June", "July", "Augast", "September", "October", "November", "December");

LengthEqualWith (N) wird wie folgt angewendet.

System.out.println("Length is 5");
List<String> result1 = months.stream().filter(lengthEqualWith(5)).collect(Collectors.toList());
result1.forEach(System.out::println);
		
System.out.println("Length is 8");
List<String> result2 = months.stream().filter(lengthEqualWith(8)).collect(Collectors.toList());
result2.forEach(System.out::println);

Sie erhalten die folgenden (wie erwarteten) Ergebnisse:

Length is 5
March
April
Length is 8
February
November
December

Dieser Lambda-Ausdruck sucht im Bereich nach der Variablen "expectedLength", die als statischer Bereich (oder Syntaxbereich) bezeichnet wird. Wenn sich die Variable expectedLength im Gültigkeitsbereich befindet (zwischengespeichert), verwendet der Lambda-Ausdruck diesen Wert.

In diesem Beispiel befindet sich der statische Bereich innerhalb der Methode lengthEqualWith (). Die Variable expectedLength muss final sein, da Lambda-Ausdrücke nur final auf lokale Variablen zugreifen können.

Selbst wenn es nicht als endgültig deklariert ist, scheint es zu funktionieren, wenn die Bedingung als endgültig erfüllt ist (dh wenn die Variable initialisiert und unveränderlich ist).

Java muss jedoch bewerten, ob diese Bedingungen erfüllt sind (es kostet Geld), sodass das Zwischenspeichern oder Nicht-Zwischenspeichern dieser Werte einen geringfügigen Unterschied in der Leistung bewirken kann. ..

Recommended Posts

Übergeben Sie die im Java8-Lambda-Ausdruck filter () verwendeten Bedingungen als Parameter
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Quelle zum Abrufen der Umleitungsquell-URL in Java
Weisen Sie Variablen Java8-Lambda-Ausdrücke zu und verwenden Sie sie erneut
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Ein Java-Benutzer hat vor einem Dutzend Jahren versucht, die Funktionen von Java8 (Lambda Style Edition) zu untersuchen.
Übergeben Sie das Gebietsschema i18n an JavaScript
Ersetzen Sie durch einen Wert entsprechend der Übereinstimmung mit einem regulären Java-Ausdruck
Beurteilen Sie, ob die zu vergleichenden Zeichenfolgen in Java identisch sind
Was ist ein Lambda-Ausdruck (Java)
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
So erhalten Sie das aktuelle Datum als Zeichenfolge im Format JJJJMMTT
Grund, L zu der Zahl hinzuzufügen, die in den langen Java-Typ eingegeben werden soll
So übergeben Sie einen Proxy, wenn Sie REST mit SSL in Java auslösen
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
Richten Sie eine Java-GUI in einem separaten Thread ein, um die Haupt-GUI beizubehalten
So implementieren Sie den Kalman-Filter mit Java
Java-Referenz zum Verständnis in der Abbildung
Lassen Sie uns nun den Java-Lambda-Ausdruck rekapitulieren
Java SE8 Silber ~ Der Weg zum Pass ~
So erhalten Sie das Datum mit Java
Fassen Sie den Lebenszyklus von Java-Objekten zusammen, die bei der Android-Entwicklung berücksichtigt werden müssen
Verwandeln Sie sich von einer normalen Klasse in einen Lambda-Stil
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
Eine Geschichte über das JDK in der Java 11-Ära
So zeigen Sie eine Webseite in Java an
CORBA scheint in Java SE 11 entfernt zu sein. .. ..
Messen Sie die Größe eines Ordners mit Java
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Es scheint kein anderes zu geben - wenn in Java
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen
Verwendung der Java-API mit Lambda-Ausdrücken
Java 8 startet jetzt ~ für jeden und Lambda-Ausdruck ~
So lösen Sie Ausdrucksprobleme in Java
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
Eine Lernmethode für unerfahrene Personen, um Java SE 8 Silver in einem Monat zu bestehen
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert
[Java] Lambda-Ausdruck
Java Lambda Ausdruck
[Java] Deklarieren wir die in der Schleife verwendeten Variablen in der Schleife [Variationen im Block]
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
[Java] So lassen Sie den privaten Konstruktor in Lombok weg
So führen Sie die SpringBoot-App als Dienst aus
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
Schreiben einer Klasse, die in Java bestellt werden kann Ein kleines Standard-Memo
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
So erstellen Sie einen Daten-URI (base64) in Java
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
In der Abbildung verstandene Java-Klassen und -Instanzen
Für Spring-Boot-2.3 muss javax.validation zur Abhängigkeit hinzugefügt werden
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
Versuchen Sie, ein eingeschränktes FizzBuzz-Problem in Java zu lösen
Schreiben Sie Hamcrest Matcher im Lambda-Stil