indexBy

계산된 키로 모든 원소를 Map<K, A>에 색인합니다 — 키가 겹치면 나중 값이 이깁니다.

Map<K, A> indexBy<A, K>(K Function(A a) f, Iterable<A> iterable) Future<Map<K, A>> indexByAsync<A, K>(FutureOr<K> Function(A a) f, FxAsyncIterable<A> iterable) Map<K, T> Fx.indexBy<K>(K Function(T a) f) // chain (sync) Future<Map<K, T>> FxAsync.indexBy<K>(FutureOr<K> Function(T a) f) // chain (async)

강의

indexBygroupBy의 형제입니다. 파이프라인 전체를 끌어당기며 원소마다 키를 계산한다는 발상은 같지만, 키마다 리스트를 모으는 대신 값을 하나만 유지합니다. 즉 Map<K, List<A>>가 아니라 Map<K, A>입니다.

그래서 중복은 쌓이지 않고 덮어씁니다. 두 원소가 같은 키를 만들어 내면 나중에 처리된 쪽(즉 이터러블에서 뒤에 오는 쪽)이 맵에 남습니다. 앞으로 훑어 나가며 result[key(a)] = a를 반복하면 자연스럽게 나오는 동작이고, FxTS와도 일치합니다. 키가 유일하다는 사실을 알고 있고(데이터베이스 ID처럼) 일일이 뒤져야 하는 리스트 대신 O(1) 조회를 바로 쓰고 싶을 때 indexBy를 꺼내 쓰면 됩니다.

키가 겹칠 것을 예상하고 모든 값을 남기고 싶다면 대신 groupBy를 쓰세요. 아무것도 버리지 않습니다.

데모 1 · 기본, 그리고 나중 값이 이기는 동작

데모 2 · 비동기

직접 해 보기

연습: 사용자를 id 기준으로 색인해서 바로 조회할 수 있게 만들어 보세요.

관련 항목: groupBy — 덮어쓰지 않고 중복을 모두 유지 · countBy — 값을 남기는 대신 개수를 세기 · fromEntries — 키/값 쌍에서 곧바로 Map 만들기