En JDK 8 con lambda b93 había una clase java.util.stream.Streams.zip en b93 que podría usarse para comprimir secuencias (esto se ilustra en el tutorial Explorando Java8 Lambdas. Parte 1 por Dhananjay Nene ). Esta función :
Crea una secuencia combinada lenta y secuencial cuyos elementos son el resultado de combinar los elementos de dos secuencias.
Sin embargo, en b98 esto ha desaparecido. De hecho, la Streams
clase ni siquiera es accesible en java.util.stream en b98 .
¿Se ha movido esta funcionalidad, y si es así, cómo comprimo las transmisiones de manera concisa usando b98?
La aplicación que tengo en mente está en esta implementación Java de Shen , donde reemplacé la funcionalidad zip en el
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
funciona con un código bastante detallado (que no utiliza la funcionalidad de b98).
Respuestas:
También necesitaba esto, así que tomé el código fuente de b93 y lo puse en una clase "util". Tuve que modificarlo ligeramente para trabajar con la API actual.
Como referencia, aquí está el código de trabajo (tómelo bajo su propio riesgo ...):
fuente
SIZED
si cualquiera de las secuencias esSIZED
, no ambas?SIZED
para que esta implementación funcione. De hecho, depende de cómo se defina la compresión. ¿Debería poder comprimir dos transmisiones que son de diferente tamaño, por ejemplo? ¿Cómo se vería la secuencia resultante entonces? Creo que esta es la razón por la cual esta función se omitió de la API. Hay muchas maneras de hacer esto y depende del usuario decidir qué comportamiento debe ser el "correcto". ¿Descartarías los elementos de la secuencia más larga o rellenarías la lista más corta? Si es así, ¿con qué valor (es)?Spliterator<A>
).zip es una de las funciones proporcionadas por la biblioteca protonpack .
fuente
Si tiene Guava en su proyecto, puede usar el método Streams.zip (se agregó en Guava 21):
fuente
Comprimir dos corrientes utilizando JDK8 con lambda ( GIST ).
fuente
import java.util.function.*;
yimport java.util.stream.*;
en la parte superior de su archivo.() -> iterator
y aquí de nuevo:iterable.spliterator()
. ¿Por qué no implementar directamente un enSpliterator
lugar de unIterator
? Compruebe @Doradus respuesta stackoverflow.com/a/46230233/1140754Como no puedo concebir el uso de comprimir en colecciones que no sean las indexadas (Listas) y soy un gran admirador de la simplicidad, esta sería mi solución:
fuente
mapToObject
debería serlomapToObj
.RandomAccess
(por ejemplo, en las listas vinculadas) esto será muy lentoLos métodos de la clase que mencionó se han trasladado a la
Stream
interfaz misma en favor de los métodos predeterminados. Pero parece que elzip
método ha sido eliminado. Tal vez porque no está claro cuál debería ser el comportamiento predeterminado para secuencias de diferentes tamaños. Pero implementar el comportamiento deseado es sencillo:fuente
predicate
has pasado al filtro con estado ? Eso viola el contrato del método y, especialmente, no funcionará al procesar la transmisión en paralelo.Humildemente sugiero esta implementación. La secuencia resultante se trunca a la más corta de las dos secuencias de entrada.
fuente
.., leftStream.isParallel() || rightStream.isParallel()
. Creo que no tiene ningún efecto porqueAbstractSpliterator
ofrece un paralelismo limitado por defecto. Así que creo que el resultado final será lo mismo que pasarfalse
.La biblioteca Lazy-Seq proporciona funcionalidad zip.
https://github.com/nurkiewicz/LazySeq
Esta biblioteca está muy inspirada
scala.collection.immutable.Stream
y tiene como objetivo proporcionar una implementación de secuencia perezosa inmutable, segura para subprocesos y fácil de usar, posiblemente infinita.fuente
Usando la última biblioteca de guayaba (para la
Streams
clase) deberías poder hacerfuente
Que este trabajo para usted? Es una función corta, que evalúa perezosamente las secuencias que está comprimiendo, por lo que puede suministrarle secuencias infinitas (no necesita tomar el tamaño de las secuencias que se están comprimiendo).
Si las secuencias son finitas, se detiene tan pronto como una de las secuencias se quede sin elementos.
Aquí hay un código de prueba de unidad (¡mucho más largo que el código mismo!)
fuente
takeWhile
al final que no parece estar en Java8, pero no es un problema, ya que la persona que llama puede filtrar los valores nulos que ocurren cuando las secuencias comprimidas no son del mismo tamaño. Creo que esta respuesta debería ser la respuesta número 1, ya que es consistente y comprensible. buen trabajo gracias de nuevo.fuente
Cyclops-react de AOL , a lo que contribuyo, también proporciona funcionalidad de compresión, tanto a través de una implementación extendida de Stream , que también implementa la interfaz Reactive-streams ReactiveSeq, como a través de StreamUtils que ofrece gran parte de la misma funcionalidad a través de métodos estáticos a Java Streams estándar.
También ofrece una compresión basada en aplicaciones más generalizada. P.ej
E incluso la capacidad de emparejar cada elemento en una secuencia con cada elemento en otro
fuente
Si alguien necesita esto todavía, hay una
StreamEx.zipWith
función en la biblioteca streamex :fuente
Esto es genial. Tuve que comprimir dos secuencias en un mapa, siendo una secuencia la clave y otra el valor
Salida: {A = Apple, B = Banana, C = Zanahoria}
fuente