Filtrage LongStream [duplicate]
J'ai deux Java LongStreams et je souhaite supprimer les valeurs présentes dans un flux de l'autre.
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
Le LongStream n'a pas de méthode contient et je ne sais pas comment utiliser anyMatch dans ce cas car la valeur à vérifier provient d'un autre flux et n'est pas dans une variable ou une constante.
Réponses
Eh bien, vous ne pouvez pas rechercher dans le Stream tant que Stream est un ensemble inachevé de pipelines, c'est-à-dire d'opérations. Cela n'a aucun sens de le comparer avec un tel Stream.
La prochaine chose qui me semble étrange est probablement une faute de frappe. Je suppose que vous voulez rechercher dans au stream1
lieu de stream2
, par conséquent:
stream2 = stream2.filter(e -> stream1.contains(e));
Le seul moyen est de comparer un LongStream
avec une collection optimisée pour une telle recherche. Je suppose que vous souhaitez continuer stream1
après avoir effectué la recherche, alors procédez comme suit:
- Fermez la
stream1
conversion en un fichierList<Long> list1
. - Effectuez la recherche en
stream2
utilisantlist1
destream1
. - Ouvrez à
stream1
nouveau pour un traitement ultérieur.
LongStream stream1 = ...
LongStream stream2 = ...
List<Long> list1 = stream1.boxed() // list1 from stream1 ..
.collect(Collectors.toList()); // .. which also closes stream1
stream2 = stream2.filter(list1::contains); // perform search
stream1 = list1.stream().mapToLong(l -> l); // open stream1 as LongStream
Edit: Utilisez Set
pour de meilleures performances comme le suggère @ fps dans sa réponse .
Vous pouvez collecter Set
et utiliser contains
:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
Pourquoi utiliser des flux?
Les collections ont la retainAll(Collection)méthode, qui fait exactement ce dont vous avez besoin, si je ne me trompe pas ...
(Ou removeAll(Collection)
juste un peu au dessus ...)