zip

Empareja los elementos de dos iterables en records y se detiene en el más corto.

Iterable<(A, B)> zip<A, B>(Iterable<A> iterable1, Iterable<B> iterable2) Iterable<(A, B, C)> zip3<A, B, C>(Iterable<A> iterable1, Iterable<B> iterable2, Iterable<C> iterable3) FxAsyncIterable<(A, B)> zipAsync<A, B>(FxAsyncIterable<A> iterable1, FxAsyncIterable<B> iterable2) Fx<(T, U)> Fx.zip<U>(Iterable<U> other) // chain FxAsync<(T, U)> FxAsync.zip<U>(FxAsyncIterable<U> other)

Lección

zip recorre dos iterables en paralelo y produce un par por paso, deteniéndose en cuanto cualquiera de las entradas se agota. Donde FxTS devuelve una tupla de TS, FxDart devuelve un record de Dart — (A, B) — de modo que desestructuras los resultados con .$1/.$2 o con pattern matching, en lugar de con índices de array. Como Dart no tiene genéricos variádicos, cada aridad tiene su propia función: zip para dos iterables y zip3 para tres.

zipAsync lanza las llamadas a next() de ambos lados antes de esperar a ninguna de las dos, así que tira de las dos fuentes en paralelo en cada par, no secuencialmente. Combinar dos fuentes de 100 ms por elemento sigue costando ~100 ms por par, no 200 ms.

Demo 1 · Fundamentos

Demo 2 · Asíncrono, tirando en paralelo por par

Pruébalo tú

Ejercicio: combina names y ages con zip en records (name, age).

Relacionado: zipWith — emparejar y combinar en un solo paso · zipWithIndex — emparejar con un índice creciente · transpose — emparejar un número arbitrario de filas · concat — encadenar en vez de emparejar