Filtro LongStream [duplicato]
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
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:
- Chiudi
stream1convertendolo in un fileList<Long> list1. - Eseguire la ricerca
stream2utilizzandolist1dastream1. - 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 .
Puoi raccogliere in a Sete utilizzare contains:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
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 ...)