Вот пример использования foldLeft
.
scala> def group[T, U](in: Iterable[T], f: T => U) = {
| in.foldLeft(Map.empty[U, List[T]]) {
| (map, t) =>
| val groupByVal = f(t)
| map.updated(groupByVal, t :: map.getOrElse(groupByVal, List.empty))
| }.mapValues(_.reverse)
| }
group: [T,U](in: Iterable[T],f: (T) => U)java.lang.Object with scala.collection.DefaultMap[U,List[T]]
scala> val ls = List(1, 2, 3, 4, 5)
ls: List[Int] = List(1, 2, 3, 4, 5)
scala> println(group(ls, (_: Int) % 2))
Map(1 -> List(1, 3, 5), 0 -> List(2, 4))
Scala 2.8 предлагает это в стандартной библиотеке:
scala> println(ls.groupBy((_: Int) % 2)) // Built into Scala 2.8.
Map(1 -> List(1, 3, 5), 0 -> List(2, 4))