Filtragem LongStream [duplicado]
Eu tenho dois Java LongStreams e quero remover os valores que estão presentes em um fluxo do outro.
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
O LongStream não tem um método contains e eu não sei como usar anyMatch neste caso porque o valor a ser verificado vem de outro stream e não está em uma variável ou constante.
Respostas
Bem, você não pode pesquisar no Stream enquanto o Stream for um conjunto inacabado de pipelines, ou seja, operações. Não faz sentido compará-lo com tal Stream.
A próxima coisa que me parece estranha é provavelmente um erro de digitação. Suponho que você deseja pesquisar no em stream1
vez de stream2
, portanto:
stream2 = stream2.filter(e -> stream1.contains(e));
A única maneira é comparar a LongStream
com uma coleção otimizada para essa pesquisa. Suponho que você queira continuar stream1
depois de realizar a pesquisa, então execute estas etapas:
- Feche a
stream1
conversão para umList<Long> list1
. - Faça a pesquisa
stream2
usandolist1
destream1
. - Abra
stream1
novamente para processamento posterior.
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
Editar: Use Set
para um melhor desempenho como @fps sugere em sua resposta .
Você pode coletar para um Set
e usar contains
:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
Por que usar streams?
As coleções têm o retainAll(Collection)método, que faz exatamente o que você precisa, se não me engano ...
(Ou removeAll(Collection)
apenas um pouco acima ...)