Filtrowanie LongStream [duplikat]

Dec 01 2020

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

1 NikolasCharalambidis Dec 01 2020 at 13:59

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 stream1zamiast stream2, stąd:

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

Jedynym sposobem jest porównanie LongStreamz kolekcją zoptymalizowaną pod kątem takiego wyszukiwania. Zakładam, że stream1po zakończeniu wyszukiwania chcesz kontynuować , więc wykonaj następujące kroki:

  1. Zamknij stream1konwersję do List<Long> list1.
  2. Przeprowadź wyszukiwanie przy stream2użyciu list1from stream1.
  3. Otwórz stream1ponownie 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 Setdla lepszej wydajności, jak sugeruje @ fps w swojej odpowiedzi .

3 fps Dec 01 2020 at 13:48

Możesz zebrać do Seti użyć 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

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