countBy
Cuenta cuántos elementos caen en cada clave calculada.
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.