Recherchez l'objet correspondant à la valeur Property d'une collection à l'aide de Java 8 Stream.
List<Person> objects = new ArrayList<>();
Attributs de personne -> Nom, Téléphone, Email.
Parcourez la liste des personnes et trouvez le courrier électronique correspondant. Vu que cela peut être fait à travers Java 8 flux facilement. Mais cela retournera toujours une collection?
Ex:
List<Person> matchingObjects = objects.stream.
filter(p -> p.email().equals("testemail")).
collect(Collectors.toList());
Mais je sais qu'il aura toujours un objet unique. Pouvons-nous faire quelque chose au lieu de Collectors.toList
donc j’ai eu l’objet réel directement.Au lieu d’obtenir la liste des objets.
Au lieu d'utiliser un collecteur, essayez d'utiliser findFirst
ou findAny
.
Optional<Person> matchingObject = objects.stream().
filter(p -> p.email().equals("testemail")).
findFirst();
Ceci retourne un Optional
car la liste pourrait ne pas contenir cet objet.
Si vous êtes sûr que la liste contient toujours cette personne, vous pouvez appeler:
Person person = matchingObject.get();
Si vous n'êtes pas sûr et que vous voulez obtenir null
s'il n'y a pas une telle personne, alors:
Person person = matchingObject.orElse(null);
Les optionnels ont aussi d’autres méthodes utiles. Jetez un oeil à facultatif javadoc .
findAny
& orElse
En utilisant findAny()
et orElse()
:
Person matchingObject = objects.stream().
filter(p -> p.email().equals("testemail")).
findAny().orElse(null);
Arrête de chercher après avoir trouvé un événement.
findAny
Optional<T> findAny()
Renvoie un facultatif décrivant un élément du flux ou un facultatif vide si le flux est vide. Ceci est une opération de terminal en court-circuit. Le comportement de cette opération est explicitement non déterministe; il est libre de sélectionner n'importe quel élément du flux. Cela permet une performance maximale dans les opérations parallèles; le coût est que plusieurs invocations sur la même source peuvent ne pas renvoyer le même résultat. (Si un résultat stable est souhaité, utilisez plutôt findFirst ().)
Guava API fournit MoreCollectors.onlyElement ( ), un collecteur qui prend un flux contenant exactement un élément et renvoie cet élément .
Le collecteur renvoyé jette un IllegalArgumentException
si le flux est composé de deux éléments ou plus et un NoSuchElementException
si le flux est vide .
Référez-vous le code ci-dessous pour l'utilisation:
import static com.google.common.collect.MoreCollectors.onlyElement;
Person matchingPerson = objects.stream
.filter(p -> p.email().equals("testemail"))
.collect(onlyElement());