Scala Iterator против других коллекций? - PullRequest
0 голосов
/ 13 октября 2018

Я просеиваю большой набор данных, анализирую и группирую на основе одних и тех же ключей.Но чтобы использовать функцию groupBy, мне нужно преобразовать свой итератор в Array.Почему groupBy отсутствует в Iterator?Я понимаю, как работает итератор и что итератор может перебирать элементы только один раз.Но когда вы предоставляете такие методы, как map, filter, foreach и т. Д. В Итераторе, почему бы также не предоставить groupBy?
Есть ли какая-то конкретная причина для этого?Потому что преобразование итератора в массив занимает больше времени при работе с большими данными.

1 Ответ

0 голосов
/ 13 октября 2018

Один из способов избежать загрузки всего набора данных в массив или список из итератора - использовать foldLeft для сборки агрегированного Map.Ниже приведен пример вычисления суммы значений по ключу с помощью foldLeft от Итератора:

val it = Iterator(("a", 1), ("a", 2), ("b", 3), ("b", 4), ("c", 5))

it.foldLeft(Map.empty[String, Int]){ case (m, (k, v)) =>
  m + (k -> (m.getOrElse(k, 0) + v))
}
// res1: scala.collection.immutable.Map[String,Int] = Map(a -> 3, b -> 7, c -> 5)

Re: проблема с groupBy на Итераторе, вот соответствующая ссылка SO и Scala-lang link .

...