Passer les conditions utilisées dans le filtre d'expression lambda Java8 () comme paramètres

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

Passer les conditions utilisées dans le filtre d'expression lambda Java8 () comme paramètres
Je veux ForEach un tableau avec une expression Lambda en Java
Source utilisée pour obtenir l'URL de la source de redirection en Java
Attribuer des expressions lambda Java8 aux variables et les réutiliser
Créer une méthode pour renvoyer le taux de taxe en Java
Il y a une dizaine d'années, un utilisateur de Java a tenté d'étudier les fonctions de Java8 (édition de style Lambda).
Passer les paramètres régionaux i18n à JavaScript
Remplacer par une valeur selon la correspondance avec une expression régulière Java
Juger si les chaînes de caractères à comparer sont les mêmes en Java
Qu'est-ce qu'une expression lambda (Java)
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Comment obtenir la date actuelle sous forme de chaîne au format aaaaMMjj
Raison pour ajouter L au nombre à mettre en type long Java
Comment passer un proxy lors du lancement de REST avec SSL en Java
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Configurez une interface graphique Java dans un thread séparé pour conserver le
Comment implémenter le filtre de Kalman par Java
Référence Java à comprendre dans la figure
Récapitulons maintenant l'expression lambda Java
Java SE8 Silver ~ La route à franchir ~
Comment obtenir la date avec Java
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
Transformer d'une classe normale en un style lambda
Deux façons de démarrer un thread en Java + @
Une histoire sur le JDK à l'ère de Java 11
Comment afficher une page Web en Java
CORBA semble avoir été supprimé dans Java SE 11. .. ..
Mesurer la taille d'un dossier avec Java
Code pour échapper aux chaînes JSON en Java
Essayez de créer un babillard en Java
Il ne semble pas y avoir d'autre-si en java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
[Java] Lors de la mise d'une chaîne de caractères dans le cas de l'instruction switch, il est nécessaire d'en faire une expression constante
Comment utiliser l'API Java avec des expressions lambda
Java 8 pour démarrer maintenant ~ for Each et expression lambda ~
Comment résoudre les problèmes d'expression en Java
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
Une méthode d'étude pour les personnes inexpérimentées pour passer Java SE 8 Silver en un mois
Passez un argument à la méthode et recevez le résultat de l'opération comme valeur de retour
[Java] Expression Lambda
Expression lambda Java
[Java] Déclarons les variables utilisées dans la boucle dans la boucle [Variations dans le bloc]
Comment créer un environnement Java en seulement 3 secondes
[Java] Comment omettre le constructeur privé dans Lombok
Comment exécuter l'application SpringBoot en tant que service
Écrivez ABNF en Java et transmettez l'adresse e-mail
Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard
J'ai essayé de créer une compétence Clova en Java
Comment créer un URI de données (base64) en Java
Remarque sur l'initialisation des champs dans le didacticiel Java
J'ai essayé de créer une fonction de connexion avec Java
Classes et instances Java comprises dans la figure
Spring-Boot-2.3 nécessite l'ajout de javax.validation à la dépendance
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java
Essayez de résoudre un problème FizzBuzz restreint en Java
Être capable d'écrire Hamcrest Matcher dans le style lambda