take

Devuelve un iterable perezoso con los primeros length valores de una fuente.

Iterable<A> take<A>(int length, Iterable<A> iterable) FxAsyncIterable<A> takeAsync<A>(int length, FxAsyncIterable<A> iterable) Fx<T> Fx.take(int count) // chain FxAsync<T> FxAsync.take(int count) FxEvents<T> FxEvents<T>.take(int count) // chain (events)

Lección

take es lo que mantiene finito a un pipeline perezoso. Deja de pedir valores a su fuente en cuanto ha emitido length valores: aguas arriba nunca recibe más peticiones que esas. Dado que fuentes de FxDart como range, repeat y cycle pueden ser infinitas, muchas veces take es lo único que hace que un pipeline sea seguro de ejecutar.

Viene como función data-first (take(n, iterable)) y como método de cadena (fx(iterable).take(n)). En el lado asíncrono, takeAsync/.take() es transparente: no serializa lo que hay aguas arriba, así que un concurrent(n) más arriba en la cadena sigue solapando sus peticiones hasta que take tiene lo que necesita.

Demo 1 · Fundamentos, y tomar de una fuente infinita

cycle repite su entrada para siempre; sin take, iterarlo no terminaría nunca:

Demo 2 · Asíncrono, y sigue solapando bajo concurrent

Aquí solo se piden 4 valores, pero el concurrent(3) de aguas arriba los sigue evaluando de 3 en 3 — take no obliga a que todo sea secuencial:

Pruébalo tú

Ejercicio: toma solo los 3 primeros nombres de la cola.

Relacionado: takeRight — los últimos n en vez de los primeros n · takeWhile — tomar según un predicado · range · cycle — fuentes infinitas · concurrent — evaluación en paralelo