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 변환 방식 중 하나입니다 (indexBycountBy도 마찬가지입니다).

버킷 안에서의 순서도 의미가 있습니다. 원소는 소스에 등장한 상대 순서 그대로 각 리스트에 들어갑니다. 그리고 종결 연산자이므로, 상류 파이프라인이 평범한 리스트든 지연 평가되는 map/filter 단계의 체인이든 동작은 완전히 동일합니다 — groupBy가 값을 끌어당기는 그 시점에 비용을 한 번 치를 뿐입니다.

데모 1 · 기본

데모 2 · 비동기

직접 해 보기

연습: 단어들을 길이별로 그룹화해 보세요.

관련 항목: indexBy — 리스트 대신 키마다 값 하나만 담습니다 · countBy — 원소를 모으는 대신 키별 개수를 셉니다 · partition — 정확히 두 개의 버킷으로 나눕니다