Filtragem LongStream [duplicado]

Dec 01 2020

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

1 NikolasCharalambidis Dec 01 2020 at 13:59

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 stream1vez de stream2, portanto:

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

A única maneira é comparar a LongStreamcom uma coleção otimizada para essa pesquisa. Suponho que você queira continuar stream1depois de realizar a pesquisa, então execute estas etapas:

  1. Feche a stream1conversão para um List<Long> list1.
  2. Faça a pesquisa stream2usando list1de stream1.
  3. Abra stream1novamente 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 Setpara um melhor desempenho como @fps sugere em sua resposta .

3 fps Dec 01 2020 at 13:48

Você pode coletar para um Sete usar 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

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