Скала, эквивалентная котлинской группировке - PullRequest
0 голосов
/ 09 сентября 2018

Я не могу найти простой Scala-эквивалент Kotlins groupingBy метода, доступного для Iterables, который действует как Scalas groupBy, но не с готовностью создает списки. Вместо этого он создает представление «группировки» для последующего использования.

Например, для работы с небольшими массивами достаточно groupBy:

List(1, 2, 3, 4).groupBy(_ < 3) //Map(false -> List(3, 4), true -> List(1, 2))

Но для больших или бесконечных коллекций это не сработает, если я заинтересован в том, чтобы работать не с нетерпением, а только над некоторыми результатами.

Редактировать : Извините, пример не полностью выразил, как работает groupingBy. Если вход имеет длину n, он разбивает входные данные на потенциально 1 до n группы. В котлине ты пишешь:

listOf(1, 2, 3, 4).groupingBy(it % 3).eachCount() // { 0=1, 1=2, 2=1 }

И вы получаете промежуточный Grouping объект, к которому вы можете применить завершающую операцию, такую ​​как eachCount, которая создает карту результатов.

1 Ответ

0 голосов
/ 09 сентября 2018

Это можно сделать в два этапа.

val (t,f) = List(1, 2, 3, 4).partition(_ < 3)
val m = Map(true -> t, false -> f)
//Map[Boolean,List[Int]] = Map(true -> List(1, 2), false -> List(3, 4))

Это также работает для ленивых коллекций.

val (t,f) = Iterator.from(1).partition(_%3<1)
val m = Map(true -> t, false -> f)
//Map[Boolean,Iterator[Int]] = Map(true -> non-empty iterator, false -> non-empty iterator)

m(true).take(12).toList
//res0: List[Int] = List(3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36)

m(false).take(12).toList
//res1: List[Int] = List(1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17)
...