Генерация частотной карты для строки в Scala

Допустим, у меня есть строка "привет", и я хочу сгенерировать карту частот символов:

Map[Char,Int] = Map(h -> 1, e -> 1, o -> 1, l -> 2)

Я мог бы сделать это итеративно:

val str = "hello"
var counts = new scala.collection.mutable.HashMap[Char,Int]
for (i <- str) {
    if (counts.contains(i))
        counts.put(i, counts(i) + 1)
    else
        counts.put(i, 1)
}

Пошарив в REPL, я обнаружил, что могу сделать что-то более лаконичное, не используя изменяемую коллекцию:

> str.groupBy(_.toChar).map{ p => (p._1, p._2.length)}
scala.collection.immutable.Map[Char,Int] = Map(h -> 1, e -> 1, o -> 1, l -> 2)

Но я не знаю ни о характеристиках производительности groupBy (), ни о том, что происходит в блоке, переданном в map (например, что такое p).

Как мне сделать это идиоматически, используя функциональные парадигмы в Scala?

Для справки, я впервые приезжаю в Scala из Ruby. В Ruby я бы использовалinject но я не уверен, что параллельный способ сделать это в Scala:

counts = str.each_byte.inject(Hash.new(0)){ |h, c| h[c] += 1; h}

Ответы на вопрос(4)

Ваш ответ на вопрос