Tengo una interfaz que vuelve java.lang.Iterable<T>
.
Me gustaría manipular ese resultado utilizando la API Java 8 Stream.
Sin embargo, Iterable no puede "transmitir".
¿Alguna idea de cómo usar Iterable como Stream sin convertirlo en List?
java
java-8
java-stream
iterable
Rayman
fuente
fuente
myIterable.stream()
no existe!Stream.of(iterable)
produceStream<Iterable<Object>>
.Respuestas:
Hay una respuesta mucho mejor que usar
spliteratorUnknownSize
directamente, lo cual es más fácil y obtiene un mejor resultado.Iterable
tiene unspliterator()
método, por lo que debe usarlo para obtener su spliterator. En el peor de los casos, es el mismo código (la implementación predeterminada lo usaspliteratorUnknownSize
), pero en el caso más común, dondeIterable
ya es una colección, obtendrá un mejor spliterator y, por lo tanto, un mejor rendimiento de transmisión (tal vez incluso un buen paralelismo). También es menos código:Como puede ver, obtener una transmisión de un
Iterable
(vea también esta pregunta ) no es muy doloroso.fuente
Stream
habría sido bueno, por ejemploStream.ofIterable(iterable)
.Si puede usar la biblioteca Guava, desde la versión 21, puede usar
fuente
Lists.newArrayList(Iterable)
.Puede crear fácilmente
Stream
unIterable
oIterator
:fuente
stream(...)
saturar tu código?Me gustaría sugerir el uso de la biblioteca JOOL , oculta la magia de spliterator detrás de la llamada Seq.seq (iterable) y también proporciona un montón de funcionalidades adicionales útiles.
fuente
Entonces, como otra respuesta mencionó, Guava tiene soporte para esto al usar:
Quiero resaltar que la implementación hace algo ligeramente diferente a otras respuestas sugeridas. Si el
Iterable
es de tipo,Collection
lo echan.fuente
He creado esta clase:
Creo que es perfectamente legible porque no tienes que pensar en spliterators y booleans (isParallel).
fuente
Una solución muy simple para este problema es crear una
Streamable<T>
interfazIterable<T>
que se extienda y que contenga undefault <T> stream()
método.Ahora cualquiera de tus
Iterable<T>
correos electrónicos se puede hacer trivialmente en streaming simplemente declarándolos enimplements Streamable<T>
lugar de hacerloIterable<T>
.fuente
Si utiliza Vavr (anteriormente conocido como Javaslang), esto puede ser tan fácil como:
fuente
Otra forma de hacerlo, con Java 8 y sin bibliotecas externas:
fuente