zip

두 이터러블의 원소를 짝지어 레코드로 묶고, 짧은 쪽이 끝나면 멈춥니다.

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)

강의

zip은 두 이터러블을 나란히 훑으면서 한 단계마다 쌍 하나를 내보내고, 어느 한쪽이 소진되는 순간 멈춥니다. FxTS가 TS 튜플을 반환하는 자리에서 FxDart는 Dart의 레코드 (A, B)를 반환하므로, 배열 인덱스 대신 .$1/.$2나 패턴 매칭으로 결과를 분해합니다. Dart에는 가변 제네릭이 없기 때문에 인자 개수마다 함수가 따로 있습니다. 이터러블 두 개는 zip, 세 개는 zip3입니다.

zipAsync는 양쪽의 next() 호출을 어느 쪽도 await하기 전에 먼저 걸어 둡니다 — 즉 쌍마다 두 소스를 순차가 아니라 병렬로 끌어옵니다. 원소당 100ms가 걸리는 소스 두 개를 zip해도 쌍당 200ms가 아니라 약 100ms만 듭니다.

데모 1 · 기본

데모 2 · 비동기, 쌍마다 병렬로 끌어오기

직접 해 보기

연습: namesages를 zip해서 (name, age) 레코드로 묶어 보세요.

관련 항목: zipWith — 짝짓기와 결합을 한 번에 · zipWithIndex — 증가하는 인덱스와 짝짓기 · transpose — 임의 개수의 행을 zip · concat — 짝짓는 대신 이어 붙이기