countBy

Cuenta cuántos elementos caen en cada clave calculada.

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

Lección

countBy completa el trío junto a groupBy e indexBy: la misma idea de tirar de todo el pipeline y calcular una clave por elemento, pero esta vez no conserva los elementos en absoluto — solo incrementa un contador por clave. El resultado es un Map<K, int>: cuántos elementos produjeron cada clave.

Piensa en los tres como respuestas a preguntas distintas sobre la misma agrupación: groupBy — «dame todos los elementos de esta clave», indexBy — «dame el último elemento de esta clave», y countBy — «¿cuántos elementos tuvieron esta clave?». Si lo único que necesitas es el recuento, countBy sale más barato que groupBy(...).map((k, v) => MapEntry(k, v.length)), porque nunca reserva las listas intermedias.

También es más barato que el bucle que escribirías en su lugar. La versión obvia, counts[k] = (counts[k] ?? 0) + 1, toca la tabla hash dos veces por elemento — una para leer y otra para volver a escribir — y cuando lo único que haces es contar, la tabla es prácticamente todo el coste. countBy cuenta en una celda mutable alojada en la tabla, así que esta se escribe una vez por clave distinta en lugar de una vez por elemento: alrededor de 1,5× más rápido que el bucle a mano sobre un millón de elementos, y el margen se mantiene desde un puñado de claves hasta decenas de miles. Nivel de log más frecuente desarrolla el número de principio a fin.

Como siempre, es un operador terminal: nada de aguas arriba se ejecuta hasta que countBy tira de ello.

Demo 1 · Fundamentos

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: cuenta cuántos votos recibió cada candidato.

Relacionado: groupBy — conserva todos los elementos en lugar de solo un recuento · indexBy — conserva el último elemento en lugar de un recuento · size — un recuento total, sin clave alguna