takeWhile

Emite valores mientras un predicado devuelva true; después se detiene definitivamente.

Iterable<A> takeWhile<A>(bool Function(A a) f, Iterable<A> iterable) FxAsyncIterable<A> takeWhileAsync<A>(FutureOr<bool> Function(A a) f, FxAsyncIterable<A> iterable) Fx<T> Fx.takeWhile(bool Function(T value) test) // chain FxAsync<T> FxAsync.takeWhile(FutureOr<bool> Function(T a) f)

Lección

Donde take cuenta valores, takeWhile los pone a prueba. Emite los elementos de uno en uno y para en el instante en que f devuelve false: nunca mira más allá de ese punto, aunque un elemento posterior sí habría pasado. Eso lo hace ideal para situaciones de «consume hasta que los datos dejen de tener sentido»: un stream ordenado hasta un umbral, un log hasta la primera anomalía, etc.

Como es perezoso y cortocircuita en el primer fallo, resulta barato de ejecutar incluso sobre una fuente enorme o infinita: solo evalúa el prefijo que realmente coincide.

Demo 1 · Fundamentos

Fíjate en que el 2 del final nunca tiene oportunidad: el predicado ya falló en el 7:

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: conserva las temperaturas solo mientras se mantengan por debajo de 25.

Relacionado: take — toma por cantidad en lugar de por predicado · takeUntilInclusive — para después de la coincidencia, incluyéndola · dropWhile — el inverso · filter — conserva las coincidencias en todas partes, no solo en un prefijo