fold

초깃값을 받는 형태의 reduce입니다. 파이프라인이 비어 있어도 언제나 안전합니다.

Acc fold<A, Acc>(Acc seed, Acc Function(Acc acc, A a) f, Iterable<A> iterable) Future<Acc> foldAsync<A, Acc>(FutureOr<Acc> seed, FutureOr<Acc> Function(Acc acc, A a) f, FxAsyncIterable<A> iterable) Acc Fx.fold<Acc>(Acc initialValue, Acc Function(Acc acc, T a) combine) // chain (sync, inherited from Iterable) Future<Acc> FxAsync.fold<Acc>(FutureOr<Acc> seed, FutureOr<Acc> Function(Acc acc, T a) f) // chain (async)

강의

fold는 시작 값을 명시적으로 주는 reduce입니다. FxTS에서는 그저 인자를 세 개 넘긴 reduce, 즉 reduce(f, seed, iterable)일 뿐입니다. Dart는 인자 개수로 오버로드를 구분하지 못하므로 FxDart는 둘을 나눴습니다. 초깃값 없는 형태는 reduce라는 이름을 그대로 쓰고, 초깃값을 받는 형태는 fold로 이름을 바꿨습니다. Dart의 Iterable이 바로 이 연산에 이미 쓰고 있는 이름이기도 합니다.

인자 순서를 잘 봐 두세요. fold(seed, f, iterable)입니다 — 초깃값이 먼저, 그다음 결합 함수, 마지막이 소스입니다. 체인 형태에서 Iterable.fold(initialValue, combine)과 같은 순서죠. 함수가 먼저 오는 FxTS의 reduce(f, seed, iterable)과는 다릅니다.

초깃값을 항상 직접 넘기기 때문에 fold는 빈 이터러블에서도 예외를 던지지 않고 초깃값을 그대로 반환합니다. 그래서 파이프라인에 원소가 하나라도 있는지 확신할 수 없을 때 더 안전한 기본 선택지입니다. reduce와 마찬가지로 종결 연산자이므로, fold가 값을 끌어당기기 전까지 상류에서는 아무 일도 일어나지 않습니다.

데모 1 · 기본과 빈 입력

데모 2 · 비동기, Map 만들어 나가기

초깃값이 숫자일 필요는 없습니다 — 여기서는 지연이 있는 파이프라인을 길이별 히스토그램으로 접습니다:

직접 해 보기

연습: 1000에서 시작해 입금 내역을 fold로 접어 잔액을 계산해 보세요.

관련 항목: reduce — 초깃값이 없는 짝 · reduceLazy — 재사용 가능한 커링된 리듀서 · sum — 흔히 쓰는 fold를 특화한 함수 · scan — fold와 비슷하지만 중간값을 모두 지연 방출