Filtrado LongStream [duplicado]
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
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 stream1
lugar de stream2
, por lo tanto:
stream2 = stream2.filter(e -> stream1.contains(e));
La única forma es comparar a LongStream
con una colección optimizada para dicha búsqueda. Supongo que desea continuar stream1
después de realizar la búsqueda, así que siga estos pasos:
- Cierre
stream1
convirtiéndolo aList<Long> list1
. - Realice la búsqueda
stream2
usandolist1
fromstream1
. stream1
Vuelva 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 Set
para un mejor rendimiento como sugiere @ fps en su respuesta .
Puede recopilar Set
y usar contains
:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
¿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 ...)