para jdk descargar java java-8 java-stream iterable

descargar - Convierta Iterable a transmisión usando Java 8 JDK



java offline (8)

Entonces, como otra respuesta mencionada, Guava tiene soporte para esto usando:

Streams.stream(iterable);

Quiero destacar que la implementación hace algo ligeramente diferente a otras respuestas sugeridas. Si el Iterable es de tipo Collection lo lanzan.

public static <T> Stream<T> stream(Iterable<T> iterable) { return (iterable instanceof Collection) ? ((Collection<T>) iterable).stream() : StreamSupport.stream(iterable.spliterator(), false); } public static <T> Stream<T> stream(Iterator<T> iterator) { return StreamSupport.stream( Spliterators.spliteratorUnknownSize(iterator, 0), false ); }

Tengo una interfaz que devuelve java.lang.Iterable<T> .

Me gustaría manipular ese resultado utilizando la API de Java 8 Stream.

Sin embargo, Iterable no puede "transmitir".

¿Alguna idea de cómo usar el Iterable como un flujo sin convertirlo a la lista?


Hay una respuesta mucho mejor que usar spliteratorUnknownSize directamente, que es más fácil y obtiene un mejor resultado. Iterable tiene un método spliterator() , así que solo debes usarlo para obtener tu spliterator. En el peor de los casos, es el mismo código (la implementación predeterminada usa spliteratorUnknownSize ), pero en el caso más común, donde Iterable ya es una colección, obtendrá un mejor spliterator y, por lo tanto, un mejor rendimiento de la transmisión (tal vez incluso un buen paralelismo). ). También es menos código:

StreamSupport.stream(iterable.spliterator(), false) .filter(...) .moreStreamOps(...);

Como puede ver, obtener una transmisión de un Iterable (vea también esta pregunta ) no es muy doloroso.


He creado esta clase:

public class Streams { /** * Converts Iterable to stream */ public static <T> Stream<T> streamOf(final Iterable<T> iterable) { return toStream(iterable, false); } /** * Converts Iterable to parallel stream */ public static <T> Stream<T> parallelStreamOf(final Iterable<T> iterable) { return toStream(iterable, true); } private static <T> Stream<T> toStream(final Iterable<T> iterable, final boolean isParallel) { return StreamSupport.stream(iterable.spliterator(), isParallel); } }

Creo que es perfectamente legible porque no tienes que pensar en spliterers y booleanos (es paralelo).


Me gustaría sugerir el uso de la biblioteca JOOL , oculta la magia de los separadores detrás de la llamada Seq.seq (iterable) y también proporciona una gran cantidad de funciones útiles adicionales.


Puede crear fácilmente un Stream desde un Iterable o un Iterator :

public static <T> Stream<T> stream(Iterable<T> iterable) { return StreamSupport.stream( Spliterators.spliteratorUnknownSize( iterable.iterator(), Spliterator.ORDERED ), false ); }


Si puede usar la biblioteca de Guava, desde la versión 21, puede usar

Streams.stream(iterable)


Si usas Vavr (anteriormente conocido como Javaslang), esto puede ser tan fácil como:

Iterable i = //... Stream.ofAll(i);


Una Streamable<T> muy sencilla para este problema es crear una Streamable<T> que extienda Iterable<T> que contenga un método default <T> stream() .

interface Streamable<T> extends Iterable<T> { default Stream<T> stream() { return StreamSupport.stream(spliterator(), false); } }

Ahora, cualquiera de sus Iterable<T> puede convertir en trivialmente solo con declarar que implements Streamable<T> lugar de Iterable<T> .