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
spliteratorUnknownSizedirectamente, lo cual es más fácil y obtiene un mejor resultado.Iterabletiene 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, dondeIterableya 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
Streamhabrí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
StreamunIterableoIterator: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
Iterablees de tipo,Collectionlo 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