indexBy

Indexa cada elemento por una clave calculada en un Map<K, A> — gana el último duplicado.

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)

Lección

indexBy es el hermano de groupBy: la misma idea — tirar de todo el pipeline y calcular una clave por elemento — pero en vez de reunir una lista por clave, guarda exactamente un valor por clave: Map<K, A> en lugar de Map<K, List<A>>.

Eso significa que los duplicados no se acumulan: se sobrescriben. Si dos elementos producen la misma clave, el que se procese en último lugar (es decir, el que aparece después en el iterable) es el que queda en el map. Es el comportamiento natural de ir haciendo result[key(a)] = a mientras se avanza, y coincide con FxTS. Recurre a indexBy precisamente cuando sepas que las claves deben ser únicas (como un ID de base de datos) y quieres una búsqueda directa O(1) en vez de una lista en la que tendrías que buscar.

Si de verdad esperas claves duplicadas y quieres conservar todos los valores, usa groupBy en su lugar — nunca descarta nada.

Demo 1 · Fundamentos & gana el último

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: indexa los usuarios por su id, para poder buscar uno directamente.

Relacionado: groupBy — conserva todos los duplicados en lugar de sobrescribirlos · countBy — cuenta en vez de conservar el valor · fromEntries — construye un Map directamente a partir de pares clave/valor