Фильтрация LongStream [дубликат]
У меня есть два Java LongStream, и я хочу удалить значения, которые присутствуют в одном потоке, из другого.
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
LongStream не имеет метода contains, и я не знаю, как использовать anyMatch в этом случае, потому что проверяемое значение поступает из другого потока и не находится в переменной или константе.
Ответы
Что ж, вы не можете искать в Stream, пока Stream - это незаконченный набор конвейеров, то есть операций. Нет смысла сравнивать это с таким Stream.
Следующее, что мне кажется странным, это, вероятно, опечатка. Я предполагаю, что вы хотите искать stream1вместо stream2, следовательно:
stream2 = stream2.filter(e -> stream1.contains(e));
Единственный способ - сравнить LongStreamс коллекцией, оптимизированной для такого поиска. Я предполагаю, что вы хотите продолжить stream1после выполнения поиска, поэтому выполните следующие действия:
- Закройте
stream1преобразование в файлList<Long> list1. - Выполните поиск с
stream2использованиемlist1отstream1. - Откройте
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 в своем ответе .
Вы можете собрать Setи использовать contains:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
Зачем вообще использовать потоки?
У коллекций есть retainAll(Collection)метод, который делает именно то, что вам нужно, если я не ошибаюсь ...
(Или removeAll(Collection)чуть выше ...)