chunk

Devuelve un iterable perezoso de listas, cada una con hasta size elementos consecutivos.

Iterable<List<A>> chunk<A>(int size, Iterable<A> iterable) FxAsyncIterable<List<A>> chunkAsync<A>(int size, FxAsyncIterable<A> iterable) Fx<List<T>> Fx.chunk(int size) // chain FxAsync<List<T>> FxAsync.chunk(int size)

Lección

chunk agrupa una secuencia plana en bloques de tamaño fijo: repartir cartas en manos, paginar un conjunto de resultados, enviar trabajo a una API en lotes de n. Solo mantiene en memoria size elementos a la vez antes de emitir cada lista, así que sigue siendo perezoso y de memoria acotada incluso sobre una fuente enorme; únicamente el último chunk puede quedarse corto, si la fuente no se divide de forma exacta.

La versión asíncrona, chunkAsync, espera size elementos antes de producir cada chunk; combínala con .concurrent(n) aguas arriba para resolver de forma concurrente el trabajo asíncrono de un chunk entero.

Demo 1 · Fundamentos

10 elementos troceados de 3 en 3 dejan un último chunk más corto:

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: reparte las cartas en manos de 3.

Relacionado: slice — una única ventana arbitraria en lugar de lotes repetidos · split — agrupa por separador en lugar de por tamaño fijo · transpose — intercambia filas y columnas de datos ya troceados