Groups the elements of a list based on the given function and returns the count of elements in each group.

Use Iterable.map() to map each element to the value returned by fn, Iterable.toSet() to get the unique values of the list.
Use Map.fromIterable(), Iterable.where() and Iterable.length to generate a map with the unique values as keys and their frequencies as values.

代码实现

Map<Y, int> countBy<T, Y>(Iterable<T> itr, Y Function(T) fn) {
  return Map.fromIterable(itr.map(fn).toSet(),
      value: (i) => itr.where((v) => fn(v) == i).length);
}

使用样例

countBy(['one', 'two', 'three'], (v) => v.length); // [{3: 2, 5: 1}]