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