Filtrado LongStream [duplicado]

Dec 01 2020

Tengo dos Java LongStreams y quiero eliminar los valores que están presentes en una secuencia de la otra.

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

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

LongStream no tiene un método contiene y no sé cómo usar anyMatch en este caso porque el valor que se va a verificar proviene de otro flujo y no está en una variable o constante.

Respuestas

1 NikolasCharalambidis Dec 01 2020 at 13:59

Bueno, no puede buscar en Stream siempre que Stream sea un conjunto inacabado de tuberías, es decir, operaciones. No tiene sentido compararlo con tal Stream.

Lo siguiente que me parece extraño es probablemente un error tipográfico. Supongo que desea buscar en el stream1lugar de stream2, por lo tanto:

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

La única forma es comparar a LongStreamcon una colección optimizada para dicha búsqueda. Supongo que desea continuar stream1después de realizar la búsqueda, así que siga estos pasos:

  1. Cierre stream1convirtiéndolo a List<Long> list1.
  2. Realice la búsqueda stream2usando list1from stream1.
  3. stream1Vuelva a abrir para su posterior procesamiento.
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: Úselo Setpara un mejor rendimiento como sugiere @ fps en su respuesta .

3 fps Dec 01 2020 at 13:48

Puede recopilar Sety 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 qué utilizar streams?

Las colecciones tienen el retainAll(Collection)método, que hace justo lo que necesita, si no me equivoco ...
(O removeAll(Collection)solo un poco más arriba ...)