Filtrage LongStream [duplicate]

Dec 01 2020

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

1 NikolasCharalambidis Dec 01 2020 at 13:59

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 stream1lieu de stream2, par conséquent:

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

Le seul moyen est de comparer un LongStreamavec une collection optimisée pour une telle recherche. Je suppose que vous souhaitez continuer stream1après avoir effectué la recherche, alors procédez comme suit:

  1. Fermez la stream1conversion en un fichier List<Long> list1.
  2. Effectuez la recherche en stream2utilisant list1de stream1.
  3. Ouvrez à stream1nouveau 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 Setpour de meilleures performances comme le suggère @ fps dans sa réponse .

3 fps Dec 01 2020 at 13:48

Vous pouvez collecter Setet utiliser contains:

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

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

stream2 = stream2.filter(set1::contains);
1 UsagiMiyamoto Dec 01 2020 at 14:17

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