5 votes

Filtrage de LongStream

J'ai deux Java LongStreams et je veux 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 ne possède pas de méthode contains 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.

3voto

Vous pourriez collecter à un Set et utiliser contains :

LongStream stream1 = ...
LongStream stream2 = ...

Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());

stream2 = stream2.filter(set1::contains);

1voto

Nikolas Points 11342

Eh bien, vous ne pouvez pas effectuer de recherche dans le flux tant que celui-ci 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 chercher dans le stream1 au lieu de stream2 donc :

stream2 = stream2.filter(e -> stream1.contains(e));

Le seul moyen est de comparer un LongStream avec une collection qui est optimisée pour une telle recherche. Je suppose que vous voulez continuer le stream1 après avoir effectué la recherche, alors effectuez ces étapes :

  1. Fermer stream1 en le convertissant en un List<Long> list1 .
  2. Effectuez la recherche dans stream2 en utilisant list1 de stream1 .
  3. Ouvrir 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 @ fps suggère dans son responder .

1voto

Usagi Miyamoto Points 4622

Pourquoi utiliser les flux ?

Les collections ont le retainAll(Collection) méthode, qui fait exactement ce dont vous avez besoin, si je ne me trompe pas...
(Ou removeAll(Collection) juste un peu plus haut...)

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