Filtrowanie LongStream [duplikat]
Mam dwa Java LongStreams i chcę usunąć wartości, które są obecne w jednym strumieniu z drugiego.
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
LongStream nie ma metody zawiera i nie wiem, jak użyć anyMatch w tym przypadku, ponieważ wartość do sprawdzenia pochodzi z innego strumienia i nie znajduje się w zmiennej ani stałej.
Odpowiedzi
Cóż, nie możesz wyszukiwać w strumieniu, dopóki Stream jest niedokończonym zestawem potoków, tj. Operacji. Nie ma sensu porównywać tego z takim Streamem.
Następną rzeczą, która wydaje mi się dziwna, jest prawdopodobnie literówka. Zakładam, że chcesz szukać w stream1
zamiast stream2
, stąd:
stream2 = stream2.filter(e -> stream1.contains(e));
Jedynym sposobem jest porównanie LongStream
z kolekcją zoptymalizowaną pod kątem takiego wyszukiwania. Zakładam, że stream1
po zakończeniu wyszukiwania chcesz kontynuować , więc wykonaj następujące kroki:
- Zamknij
stream1
konwersję doList<Long> list1
. - Przeprowadź wyszukiwanie przy
stream2
użyciulist1
fromstream1
. - Otwórz
stream1
ponownie do dalszego przetwarzania.
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
Edycja: Użyj Set
dla lepszej wydajności, jak sugeruje @ fps w swojej odpowiedzi .
Możesz zebrać do Set
i użyć contains
:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
Po co w ogóle korzystać ze strumieni?
Kolekcje mają retainAll(Collection)metodę, która robi dokładnie to, czego potrzebujesz, jeśli się nie mylę ...
(Lub removeAll(Collection)
trochę powyżej ...)