Sélectionnez un seul élément
Intuitivement, sélectionner un seul élément est nettement plus facile que sélectionner plusieurs éléments, mais cela pose quelques problèmes. Examinons d'abord quel est le problème avec l'approche générale, puis comment utiliser les expressions lambda pour le résoudre.
Créons d'abord une nouvelle méthode pour rechercher un élément commençant par une lettre spécifique, puis imprimons-le.
Copiez le code comme suit :
public static void pickName (
final List<String> noms, final String StartingLetter) {
Chaîne foundName = null ;
for(Nom de la chaîne : noms) {
if(nom.startsWith(startingLetter)) {
foundName = nom ;
casser;
}
}
Cette méthode est aussi puante que le camion poubelle qui vient de passer. Nous avons d'abord créé une nouvelle variable foundName, puis l'avons initialisée à null - c'est la source de la puanteur. Nous devons vérifier s'il est nul, sinon une NullPointerException ou une réponse d'erreur sera générée. Nous utilisons également un itérateur externe pour parcourir la liste. Si nous trouvons l'élément souhaité, nous devons sortir de la boucle, ce qui ajoute à l'odeur d'origine : la paranoïa du type de base, le style impératif, la mutabilité, tout prend vie. Une fois que nous sortons de la boucle, nous devons vérifier les résultats avant de les imprimer. Une si petite tâche nécessite en réalité un code si long.
Réanalysons ce problème. Nous voulons simplement pouvoir sélectionner le premier élément correspondant et gérer en toute sécurité le cas où aucun élément de ce type n'existe. Réécrivons cette méthode pickName en utilisant une expression lambda.
Copiez le code comme suit :
public static void pickName (
final List<String> noms, final String StartingLetter) {
final Facultatif<String> foundName =
noms.stream()
.filter(nom ->nom.startsWith(startingLetter))
.findFirst();
System.out.println(String.format("Un nom commençant par %s : %s",
StartingLetter, foundName.orElse("Aucun nom trouvé")));
}
Certaines fonctions puissantes du JDK rendent ce code très concis. Tout d’abord, nous utilisons la méthode filter pour obtenir tous les éléments qui remplissent les conditions, puis utilisons la méthode findFirst de la classe Stream pour sélectionner le premier élément de la collection renvoyée. Cette méthode renvoie un objet facultatif, qui est le désodorisant officiellement certifié pour les variables nulles en Java.
La classe Optionnelle est très utile, vous n'avez pas à vous soucier de savoir si le résultat existe ou non. Cela nous évite les problèmes liés aux exceptions de pointeur nul et montre plus clairement qu'aucun résultat n'est un résultat possible. Grâce à la méthode isPresent(), nous pouvons savoir si le résultat existe. Si nous voulons obtenir la valeur du résultat, nous pouvons utiliser la méthode get(). Nous pouvons également lui définir une valeur par défaut en utilisant (le nom de cette méthode vous choquera) la méthode orElse, tout comme dans le code précédent.
Nous utilisons la collection d'amis que nous utilisions auparavant pour vérifier notre méthode pickName.
Copiez le code comme suit :
pickName(amis, "N");
pickName(amis, "Z");
Ce code sélectionne le premier élément correspondant et imprime un message convivial s'il n'est pas trouvé.
Copiez le code comme suit :
Un nom commençant par N : Nate
Un nom commençant par Z : Aucun nom trouvé
La combinaison de la méthode findFirst() et de la classe Optinal réduit la quantité de notre code et semble bonne. Mais les fonctions de la classeOptional sont bien plus que cela. Par exemple, en plus de fournir une valeur par défaut lorsque l'objet n'existe pas, vous pouvez également l'utiliser pour exécuter un morceau de code, ou une expression lambda, si le résultat existe, comme ceci :
Copiez le code comme suit :
foundName.ifPresent(nom -> System.out.println("Bonjour " + nom));
Comparé au code impératif de sélection du premier nom correspondant, le style fonctionnel élégant du flux est meilleur. Mais y a-t-il trop de choses à faire dans cette version du flux d’appels ? Bien sûr que non, ces méthodes sont très intelligentes et fonctionnent à la demande (nous explorerons cela en profondeur dans Évaluation paresseuse des flux à la page 113).
L'exemple de sélection d'un seul élément montre des fonctions plus puissantes de la bibliothèque JDK. Voyons comment les expressions lambda peuvent trouver une valeur souhaitée en fonction d'une collection.