Filtro LongStream [duplicato]

Dec 01 2020

Ho due Java LongStream e desidero rimuovere i valori presenti in uno stream dall'altro.

LongStream stream 1 = ...
LongStream stream 2 = ...

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

Il LongStream non ha un metodo contains e non so come usare anyMatch in questo caso perché il valore da controllare proviene da un altro stream e non è in una variabile o costante.

Risposte

1 NikolasCharalambidis Dec 01 2020 at 13:59

Bene, non puoi cercare nello Stream fintanto che Stream è un insieme incompleto di pipeline, cioè operazioni. Non ha senso confrontarlo con tale Stream.

La prossima cosa che mi sembra strana è probabilmente un errore di battitura. Presumo che tu voglia cercare in stream1invece di stream2, quindi:

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

L'unico modo è confrontare a LongStreamcon una raccolta ottimizzata per tale ricerca. Presumo che tu voglia continuare stream1dopo aver eseguito la ricerca, quindi esegui questi passaggi:

  1. Chiudi stream1convertendolo in un file List<Long> list1.
  2. Eseguire la ricerca stream2utilizzando list1da stream1.
  3. Apri di stream1nuovo per ulteriori elaborazioni.
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

Modifica: utilizzare Setper prestazioni migliori come suggerisce @ fps nella sua risposta .

3 fps Dec 01 2020 at 13:48

Puoi raccogliere in a Sete utilizzare 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

Perché utilizzare gli stream?

Le collezioni hanno il retainAll(Collection)metodo, che fa proprio quello che ti serve, se non sbaglio ...
(O removeAll(Collection)solo un po 'sopra ...)