concat
첫 번째 이터러블을 모두 내보낸 뒤, 이어서 두 번째 이터러블을 지연 평가로 내보냅니다.
Iterable<A> concat<A>(Iterable<A> iterable1, Iterable<A> iterable2)
FxAsyncIterable<A> concatAsync<A>(FxAsyncIterable<A> iterable1, FxAsyncIterable<A> iterable2)
Fx<T> Fx.concat(Iterable<T> other) // chain
FxAsync<T> FxAsync.concat(FxAsyncIterable<T> other)
강의
concat은 두 이터러블을 새 리스트로 복사하지 않고 앞뒤로
이어 붙입니다. 양쪽 모두 완전히 지연 평가되므로, 파이프라인이 첫 번째
소스의 끝을 실제로 지나가지 않는 한 두 번째 이터러블은 전혀 건드리지
않습니다. 따라서 비용이 큰 소스나 무한 소스를 첫 번째로 두고 뒤에 다른
소스를 붙여도, 첫 번째 소스가 가진 것보다 많이 요구하지 않는 한
안전합니다.
concatAsync는 take나 concat의 다른
async 형제들처럼 그대로 통과시키는 연산자입니다. 내부에서 어느 쪽도
직렬화하지 않기 때문에, 하류의 concurrent(n)은 현재 활성화된
쪽에 대해 여전히 pull을 겹쳐서 수행할 수 있습니다.
데모 1 · 기본과 지연 평가
두 번째 이터러블은 부수 효과가 있는 제너레이터입니다. take(2)가
첫 번째 리스트만으로 충족되기 때문에 아예 실행되지 않는 것을 확인해 보세요.
데모 2 · 비동기
직접 해 보기
연습: morning과 evening을 이어 붙여
하나의 일정으로 만들어 보세요.