groupBy
계산된 키를 기준으로 모든 원소를 Map<K, List<A>>에 나눠 담습니다.
Map<K, List<A>> groupBy<A, K>(K Function(A a) f, Iterable<A> iterable)
Future<Map<K, List<A>>> groupByAsync<A, K>(FutureOr<K> Function(A a) f, FxAsyncIterable<A> iterable)
Map<K, List<T>> Fx.groupBy<K>(K Function(T a) f) // chain (sync)
Future<Map<K, List<T>>> FxAsync.groupBy<K>(FutureOr<K> Function(T a) f) // chain (async)
강의
groupBy는 파이프라인 전체를 끌어당긴 뒤, f가
각 값에 대해 반환한 키를 기준으로 값을 버킷에 나눠 담는 종결
연산자입니다. filter와 달리 모든
원소가 그대로 유지되며 — 버려지는 것은 하나도 없고 — 단지 버킷 단위로
재배치될 뿐입니다.
FxTS 버전은 평범한 JS 객체를 반환하지만, Dart에는 임의의 계산된 키를
갖는 익명 객체 리터럴이 없기 때문에 FxDart는 대신
Map<K, List<A>>를 반환합니다. 이 섹션 전반에서
쓰이는 TS 객체 → Dart Map 변환 방식 중 하나입니다
(indexBy와
countBy도 마찬가지입니다).
버킷 안에서의 순서도 의미가 있습니다. 원소는 소스에 등장한 상대 순서
그대로 각 리스트에 들어갑니다. 그리고 종결 연산자이므로, 상류
파이프라인이 평범한 리스트든 지연 평가되는
map/filter 단계의 체인이든 동작은 완전히
동일합니다 — groupBy가 값을 끌어당기는 그 시점에 비용을
한 번 치를 뿐입니다.
데모 1 · 기본
데모 2 · 비동기
직접 해 보기
연습: 단어들을 길이별로 그룹화해 보세요.