consume

Tira de los valores a través de una cadena y los descarta — solo por sus efectos secundarios, con tope opcional.

void consume<A>(Iterable<A> iterable, [int? n]) Future<void> consumeAsync<A>(FxAsyncIterable<A> iterable, [int? n]) void Fx.consume([int? n]) // chain Future<void> FxAsync.consume([int? n])

Lección

consume es el operador terminal mínimo: tira de los valores a través de la cadena — ejecutando por sus efectos secundarios los pasos peek o mapEffect que haya aguas arriba — pero descarta cada valor en lugar de recopilarlo o reenviarlo. Recurre a él cuando todo el sentido de un pipeline son sus efectos secundarios y construir una List con toList sería tan solo reservar memoria para nada.

El n opcional lo convierte en la pareja natural de las fuentes infinitas o enormes: consume(5) tira exactamente de 5 valores y se detiene, aunque el iterable subyacente (range sin límite, cycle, repeat con una cuenta enorme) siguiera indefinidamente. Omite n para vaciar por completo un iterable finito.

consumeAsync (o .consume() sobre una cadena FxAsync) funciona igual, esperando por turno los efectos secundarios de cada valor del que tira — práctico para forzar que un pipeline asíncrono de peek/logging se ejecute de verdad sin pagar el coste de recopilar una lista de resultados que ibas a tirar de todos modos.

Demo 1 · Acotar una fuente infinita

range(1000000) normalmente no terminaría nunca si se consumiera entero — pero consume(5) se para tras 5 elementos:

Demo 2 · Efectos secundarios asíncronos, sin lista de resultados

Pruébalo tú

Ejercicio: consume solo los 3 primeros valores de un repeat() prácticamente infinito, registrando cada uno conforme se tira de él.

Relacionado: each — operador terminal que también ejecuta f, sin el atajo del límite n · toList — operador terminal que en cambio recopila los resultados · cycle — una fuente infinita que suele acompañar a consume · peek — el paso perezoso de efecto secundario que consume normalmente fuerza