web-dev-qa-db-fra.com

Java 8 API de flux pour trouver un objet unique correspondant à une valeur de propriété

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.

42
Santosh

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 .

87
Indrek Ots

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 ().)

8

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());
5
Sahil Chhabra