groupBy

Reparte cada elemento en un Map<K, List<A>> según una clave calculada.

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)

Lección

groupBy es un operador terminal que tira de todo el pipeline y coloca cada valor en una cubeta, identificada por lo que f devuelva para él. Todos los elementos se conservan: no se descarta ninguno, a diferencia de filter; simplemente se reorganizan en cubetas.

La versión de FxTS devuelve un objeto JS normal; como Dart no tiene literales de objeto anónimos con claves calculadas arbitrarias, FxDart devuelve en su lugar un Map<K, List<A>>: una de las conversiones estándar de objeto TS a Map de Dart que se usan en toda esta sección (indexBy y countBy hacen lo mismo).

El orden importa dentro de cada cubeta: los elementos caen en cada lista en el mismo orden relativo en que aparecían en la fuente. Y como es un terminal, esto funciona exactamente igual tanto si aguas arriba hay una lista simple como una cadena de pasos perezosos map/filter: solo pagas el coste una vez, cuando groupBy tira de ella.

Demo 1 · Fundamentos

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: agrupa las palabras por su longitud.

Relacionado: indexBy — un solo valor por clave en vez de una lista · countBy — cuenta por clave en vez de recolectar · partition — agrupar en exactamente dos cubetas