reduce

첫 번째 원소를 시작 시드로 삼아 파이프라인을 값 하나로 접습니다.

A reduce<A>(A Function(A acc, A a) f, Iterable<A> iterable) Future<A> reduceAsync<A>(FutureOr<A> Function(A acc, A a) f, FxAsyncIterable<A> iterable) T Fx.reduce(T Function(T acc, T a) combine) // chain (sync, inherited from Iterable) Future<T> FxAsync.reduce(FutureOr<T> Function(T acc, T a) f) // chain (async)

강의

reduce종결 연산자입니다. map이나 filter와 달리 호출하는 즉시 뒤에 있는 지연 파이프라인 전체에서 모든 값을 끌어당겨 구체적인 결과 하나를 만들어 냅니다. 이런 종결 연산자를 호출하기 전까지 상류에서는 아무것도 실행되지 않습니다.

이것은 시드가 없는 형태입니다. 이터러블의 첫 번째 원소를 시작 누산기로 삼은 뒤 나머지를 거기에 합쳐 나갑니다. 그래서 빈 이터러블에 호출하는 것은 말이 되지 않고 — 시드로 삼을 첫 원소가 없으니까요 — StateError를 던집니다.

FxTS는 인자 개수로 reduce의 시드 있는 형태와 없는 형태를 오버로드합니다 — reduce(f, iterable)reduce(f, seed, iterable)처럼요. Dart에는 인자 개수 기반 오버로딩이 없기 때문에, FxDart는 reduce를 시드 없는 형태로 남기고 시드 있는 쪽은 fold로 이름을 바꿨습니다 — Dart 자체의 Iterable.fold 명명과 맞춘 것입니다. 시드가 있다면 fold를 쓰세요.

동기 체인에서는 FxIterable을 확장하므로 .reduce(f)는 그냥 Dart 내장 메서드입니다 — 계약도, 빈 입력에서 StateError가 나는 것도 동일합니다. 비동기 체인에서는 FxAsync.reduce가 별도로 구현되어 있으며 각 결합 단계마다 await 합니다.

데모 1 · 기본 사용법 & 빈 입력 에러

데모 2 · 비동기, 그리고 동시성

reduce는 뒤에 있는 파이프라인 전체를 끌어당깁니다 — .concurrent(n) 단계까지 포함해서요. 이 단계는 상류 값을 한 번에 n개씩 평가하고, reduce는 값이 순서대로 도착하는 대로 결합합니다:

직접 해 보기

연습: reduce로 리스트에서 가장 긴 단어를 찾아보세요.

관련 항목: fold — 시드가 있는 짝 · reduceLazy — 재사용 가능한 커링된 리듀서 · sum — 숫자에 특화된 reduce · concurrent — 상류에서의 병렬 평가