streams procesamiento print parte examples ejemplo datos con collection java java-8 java-stream

procesamiento - Transmisión finita generada en Java: ¿cómo crear una?



stream java 8 ejemplo (1)

¿Existe alguna forma razonable y fácil de hacer esto en Java, sin implementar la interfaz completa de Stream por mi cuenta?

Un simple .limit() garantiza que terminará. Pero eso no siempre es lo suficientemente poderoso.

Después de los métodos de la fábrica de arroyos, el enfoque más simple para crear fuentes de flujo de aduanas sin java.util.stream.StreamSupport.stream(Supplier<? extends Spliterator<T>>, int, boolean) procesamiento de arroyos es subclasificar java.util.Spliterators.AbstractSpliterator<T> y pasarlo a java.util.stream.StreamSupport.stream(Supplier<? extends Spliterator<T>>, int, boolean)

Si tiene la intención de utilizar transmisiones paralelas, tenga en cuenta que AbstractSpliterator solo produce divisiones subóptimas. Si tiene más control sobre su fuente, la implementación completa de la interfaz Spliterator puede ser mejor.

Por ejemplo, el siguiente fragmento de código crearía una secuencia que proporciona una secuencia infinita 1,2,3 ...

en ese ejemplo en particular usted podría usar IntStream.range()

Pero el flujo obviamente terminará en algún punto, y los operadores de terminales como (collect () o findAny ()) necesitan trabajar en ello.

Las operaciones de cortocircuito como findAny() pueden terminar en un flujo infinito, siempre que haya algún elemento que coincida.

Java 9 presenta Stream.iterate para generar flujos finitos para algunos casos simples.

En Java, uno puede generar fácilmente un flujo infinito con Stream.generate(supplier) . Sin embargo, necesitaría generar una transmisión que finalmente termine.

Imagínese, por ejemplo, quiero una secuencia de todos los archivos en un directorio. La cantidad de archivos puede ser enorme, por lo tanto, no puedo recopilar todos los datos por adelantado y crear una secuencia a partir de ellos (a través de collection.stream() ). Necesito generar la secuencia pieza por pieza. Pero el flujo obviamente terminará en algún punto, y los operadores de terminales como ( collect() o findAny() ) necesitan trabajar en él, por lo que Stream.generate(supplier) no es adecuado aquí.

¿Existe alguna forma razonable y fácil de hacer esto en Java, sin implementar la interfaz completa de Stream por mi cuenta?

Puedo pensar en un simple pirateo: hacerlo con infinito Stream.generate(supplier) , y proporcionar nulo o lanzar una excepción cuando se toman todos los valores reales. Pero rompería los operadores de flujo estándar, podría usarlo solo con mis propios operadores que están conscientes de este comportamiento.

ACLARACIÓN

La gente en los comentarios me está proponiendo el operador takeWhile() . Esto no es lo que quise decir. Cómo formular mejor la pregunta ... No estoy preguntando cómo filtrar (o limitar) un flujo existente, estoy preguntando cómo crear (generar) el flujo - dinámicamente, sin cargar todos los elementos por adelantado, pero el flujo tendría Un tamaño finito (desconocido de antemano).

SOLUCIÓN

El código que buscaba es

Iterator it = myCustomIteratorThatGeneratesTheSequence(); StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false);

Acabo de ver java.nio.file.Files , cómo se implementa el método de list(path) .