Фильтрация LongStream [дубликат]

Dec 01 2020

У меня есть два Java LongStream, и я хочу удалить значения, которые присутствуют в одном потоке, из другого.

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

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

LongStream не имеет метода contains, и я не знаю, как использовать anyMatch в этом случае, потому что проверяемое значение поступает из другого потока и не находится в переменной или константе.

Ответы

1 NikolasCharalambidis Dec 01 2020 at 13:59

Что ж, вы не можете искать в Stream, пока Stream - это незаконченный набор конвейеров, то есть операций. Нет смысла сравнивать это с таким Stream.

Следующее, что мне кажется странным, это, вероятно, опечатка. Я предполагаю, что вы хотите искать stream1вместо stream2, следовательно:

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

Единственный способ - сравнить LongStreamс коллекцией, оптимизированной для такого поиска. Я предполагаю, что вы хотите продолжить stream1после выполнения поиска, поэтому выполните следующие действия:

  1. Закройте stream1преобразование в файл List<Long> list1.
  2. Выполните поиск с stream2использованием list1от stream1.
  3. Откройте stream1снова для дальнейшей обработки.
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

Изменить: используйте Setдля повышения производительности, как предлагает @ fps в своем ответе .

3 fps Dec 01 2020 at 13:48

Вы можете собрать Setи использовать 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

Зачем вообще использовать потоки?

У коллекций есть retainAll(Collection)метод, который делает именно то, что вам нужно, если я не ошибаюсь ...
(Или removeAll(Collection)чуть выше ...)