groupedBy

Grupos como registros (key, items) encadenables — agrega por grupo sin salir del pipeline.

List<({K key, List<A> items})> groupedBy<A, K>(K Function(A a) f, Iterable<A> iterable) Future<List<({K key, List<A> items})>> groupedByAsync<A, K>(FutureOr<K> Function(A a) f, FxAsyncIterable<A> iterable) Fx<({K key, List<T> items})> Fx<T>.groupedBy<K>(K Function(T a) f) // chain (sync) Future<List<({K key, List<T> items})>> FxAsync<T>.groupedBy<K>(FutureOr<K> Function(T a) f) // chain (async)

Lección

groupBy es un terminal: te entrega un Map, y en cuanto quieres «total por grupo, ordenado, top 3» estás reentrando al pipeline por fx(map.entries), con toda la ceremonia de kv.key / kv.value. groupedBy es el mismo agrupamiento como vista encadenable: cada grupo es un registro con nombre (key: …, items: …), así que la agregación por grupo, el orden y el take continúan en la misma cadena — y el código aguas abajo lee g.key / g.items en vez de los posicionales $1 / $2.

Los grupos aparecen en orden de primera aparición de la clave, exactamente como itera el mapa de groupBy. Igual que sortBy, tiene que ver todos los valores antes de poder producir el primer grupo, así que el agrupamiento en sí es ansioso mientras la cadena a su alrededor sigue siendo componible.

Es una adición nativa de Dart (sin contraparte en FxTS) — usa groupBy cuando quieras búsquedas por clave, y groupedBy cuando los grupos sean solo un paso intermedio de un pipeline más largo.

Demo 1 · Agrupar → agregar → rankear, una cadena

Demo 2 · Async

Pruébalo tú

Ejercicio: la categoría con más gasto sin tocar Map.entries.

Relacionados: groupBy — el mismo agrupamiento como Map con claves · countBy — cuando el único agregado es un conteo · sortByDesc — el siguiente paso natural de un ranking