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)
강의
indexBy는 groupBy의
형제입니다. 파이프라인 전체를 끌어당기며 원소마다 키를 계산한다는
발상은 같지만, 키마다 리스트를 모으는 대신 값을
하나만 유지합니다. 즉
Map<K, List<A>>가 아니라
Map<K, A>입니다.
그래서 중복은 쌓이지 않고 덮어씁니다. 두 원소가 같은 키를 만들어 내면
나중에 처리된 쪽(즉 이터러블에서 뒤에 오는 쪽)이
맵에 남습니다. 앞으로 훑어 나가며 result[key(a)] = a를
반복하면 자연스럽게 나오는 동작이고, FxTS와도 일치합니다. 키가 유일하다는
사실을 알고 있고(데이터베이스 ID처럼) 일일이 뒤져야 하는 리스트 대신
O(1) 조회를 바로 쓰고 싶을 때
indexBy를 꺼내 쓰면 됩니다.
키가 겹칠 것을 예상하고 모든 값을 남기고 싶다면 대신
groupBy를 쓰세요. 아무것도 버리지 않습니다.
데모 1 · 기본, 그리고 나중 값이 이기는 동작
데모 2 · 비동기
직접 해 보기
연습: 사용자를 id 기준으로 색인해서 바로 조회할 수 있게 만들어 보세요.