Les expressions Lambda peuvent être réutilisées en les affectant à des variables, mais leurs conditions de filtrage sont fixes. Attribuer une expression lambda Java8 à la variable et réutiliser
Par conséquent, si vous souhaitez modifier la condition de filtre, vous devrez peut-être définir une expression distincte. Par exemple Une expression lambda qui filtre "uniquement les chaînes d'une longueur de 5" Si vous souhaitez une expression lambda qui filtre «uniquement les chaînes d'une longueur de chaîne de 8», vous pouvez définir deux expressions comme suit:
lengthFiveOrEight
//La longueur de la chaîne est de 5
final Predicate<String> lengthEqualFive = name -> name.length() == 5;
//La longueur de la chaîne est de 8
final Predicate<String> lengthEqualEight = name -> name.length() == 8;
Ce n'est pas grave si les conditions sont toujours fixes, mais si l'application souhaite avoir la flexibilité de modifier les conditions, vous devrez peut-être définir autant d'expressions qu'il y a.
Si vous pouvez recevoir cette condition (5 ou 8 dans cet exemple) en tant que paramètre, vous pouvez éviter une telle duplication. Par exemple, vous pouvez définir la méthode suivante.
lengthEqualWith
Predicate<String> lengthEqualWith(final Integer expectsLength) {
return name -> name.length == expectsLength;
}
Au lieu d'affecter simplement une expression lambda à une variable, vous passez un argument à une méthode qui renvoie une expression lambda et appliquez cet argument à l'expression lambda. En passant attendLength comme paramètre lors de l'appel de lengthEqualWith (), il est possible de modifier les conditions de manière flexible.
Essayez de filtrer en utilisant la liste ci-dessous.
final List<String> months =
Arrays.asList("January", "February", "March", "April", "May", "June", "July", "Augast", "September", "October", "November", "December");
LengthEqualWith (N) est appliqué comme suit.
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);
Vous obtiendrez les résultats suivants (comme prévu):
Length is 5
March
April
Length is 8
February
November
December
Cette expression lambda recherche la variable expectsLength dans la portée, qui semble être appelée la portée statique (ou la portée de la syntaxe). Si la variable expectsLength est dans la portée (mise en cache), l'expression lambda utilisera cette valeur.
Dans cet exemple, la portée statique se trouve à l'intérieur de la méthode lengthEqualWith (). La variable expectsLength doit être finale, car les expressions lambda ne peuvent accéder aux variables locales qu'en final.
Même si elle n'est pas déclarée définitive, elle semble fonctionner si la condition pour être définitive est remplie (c'est-à-dire si la variable est initialisée et immuable).
Cependant, Java doit évaluer si ces conditions sont remplies (cela coûte de l'argent), de sorte que la mise en cache ou non de ces valeurs peut faire une légère différence dans les performances. ..
Recommended Posts