cycle

시퀀스를 내보낸 뒤 그것을 계속 반복합니다 — 무한히. 항상 take처럼 개수를 제한하는 연산과 함께 쓰세요.

Iterable<T> cycle<T>(Iterable<T> iterable) FxAsyncIterable<T> cycleAsync<T>(FxAsyncIterable<T> iterable) Fx<T> Fx.cycle() // chain FxAsync<T> FxAsync.cycle()

강의

cycle무한합니다. 소스 시퀀스를 한 번 흘려보내면서 값을 버퍼에 담아 두고, 그 다음부터는 그 버퍼를 영원히 반복합니다. 이 섹션의 다른 함수들과 달리 cycle은 스스로 끝나는 법이 없습니다 — 언제 멈출지 결정하는 무언가와 반드시 짝지어야 하며, 대개는 .take(n)입니다. 중간에 아무 제한도 두지 않고 cycle(...)에 곧바로 toList()consume()을 호출하면 영영 끝나지 않습니다.

알아 둘 만한 특수한 경우가 하나 있습니다. 소스를 순환시키면 원소 0개를 영원히 도는 대신 아무것도 내보내지 않습니다 — 즉 cycle([])은 안전하며 그냥 빈 결과를 만듭니다.

라운드 로빈 할당(더 긴 컬렉션을 map으로 순회하면서 작업자, 색상, 슬롯 같은 작은 리스트를 돌려 쓰는 경우)이나, 짧은 비동기 시퀀스를 반복해 폴링 루프를 흉내 내는 데 딱 맞는 구성 요소입니다. 비동기 버전인 cycleAsync(또는 FxAsync 체인에서의 .cycle())도 같은 방식으로 버퍼링하고 반복하되, 매 회차를 평소의 비동기 프로토콜로 끌어당깁니다.

데모 1 · 무한 시퀀스를 take로 제한하기

데모 2 · 비동기 cycle, 역시 take로 제한

직접 해 보기

연습: 신호등 색을 순환시켜 앞의 8개를 가져와 보세요.

관련 항목: range — 유한한 수 세기 시퀀스 · repeat — 하나의 값을 정해진 횟수만큼 반복합니다 · take — cycle에 거의 언제나 필요한 제한 · concurrent — 비동기 cycle의 작업을 겹쳐 실행합니다