3 votes

Itération de deux ensembles identiques à l'aide de Java Streams

J'ai deux HashSets avec le même type d'objets. Mes critères de recherche sont les suivants : rechercher dans le premier ensemble et, s'il n'est pas présent, rechercher dans un autre ensemble. J'ai essayé avec la couche Stream en suivant les étapes ci-dessous

Set<MyObject> firstSet = new HashSet<>();
Set<MyObject> secondSet = new HashSet<>();

et ces deux ensembles ont certaines valeurs.

Predicate<MyObject> match = myObject -> StringUtils.equals(myValue, myObject.getMyValue());

firstSet.values().stream().filter(match).findFirst()
.orElse(secondSet.values().stream().filter(match)
.findFirst().orElseThrow(()-> new MyException()));

Mon objet correspondant est dans le premier ensemble et j'ai essayé de l'obtenir manuellement et je l'ai obtenu... mais en utilisant l'itération ci-dessus, je reçois toujours l'exception même si le premier ensemble a l'objet correspondant. Merci de me corriger... merci d'avance.

3voto

Votre problème est que vous n'utilisez pas Optional.orElse comme prévu.

Lorsque vous utilisez Optional.orElse son paramètre est évalué avec impatience . Cela signifie que votre deuxième ensemble est recherché en premier, pour résoudre le paramètre de l'ensemble de votre premier ensemble. Optional.orElse .

Au lieu de cela, utilisez Optional.orElseGet qui reçoit un Supplier qui est évalué paresseusement :

firstSet.stream()
    .filter(match)
    .findFirst()
    .orElseGet(() -> secondSet.stream()
        .filter(match)
        .findFirst()
        .orElseThrow(()-> new MyException()));

EDIT : Comme l'a suggéré Holger dans les commentaires, il existe un moyen plus simple :

Stream.of(firstSet, secondSet)
    .flatMap(Set::stream)
    .filter(match)
    .findFirst()
    .orElseThrow(MyException::new);

Streaming des ensembles d'abord, puis appel flatMap garantit que les éléments du premier ensemble apparaîtront tous avant les éléments du second ensemble.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X