Kotliní standardní klihovna nabízí funkce pro groupování elementů kolekcí. Základní groupBy()
funkce přijímá lambdu a vrací mapu. V této mapě je každý klíč (key) výsledkem lambda funkce a hodnota (value) je seznam elementů z kolekce podle daného klíče.
val names = listOf("Petr", "Jan", "Marie", "Matouš", "Petra", "Soňa", "Patricie") println(names.groupBy { it.first() }) println(names.groupBy(keySelector = { it.first() })) // {P=[Petr, Petra, Patricie], J=[Jan], M=[Marie, Matouš], S=[Soňa]} println(names.groupBy { it.length }) println(names.groupBy(keySelector = { it.length })) // {4=[Petr, Soňa], 3=[Jan], 5=[Marie, Petra], 6=[Matouš], 8=[Patricie]} println(names.groupBy(keySelector = { it.length }, valueTransform = { it.toUpperCase() })) // {4=[PETR, SOŇA], 3=[JAN], 5=[MARIE, PETRA], 6=[MATOUŠ], 8=[PATRICIE]} println(names.groupBy(keySelector = { it.substring(0, 2) }, valueTransform = { if (it.length == 4) it.toUpperCase() else it.toLowerCase() })) // {Pe=[PETR, petra], Ja=[jan], Ma=[marie, matouš], So=[SOŇA], Pa=[patricie]}
Kolekce objektů Person
data class Person(val name: String, val age: Int) { override fun toString(): String { return "$name:$age" } } val persons = listOf( Person("John", 27), Person("Marry", 16), Person("Tom", 33), Person("Jack", 74), Person("Alice", 59), Person("James", 33), Person("Poly", 33), Person("Peter", 59), Person("John", 74) ) println(persons.groupBy(Person::age)) // {27=[John:27], 16=[Marry:16], 33=[Tom:33, James:33, Poly:33], 74=[Jack:74, John:74], 59=[Alice:59, Peter:59]} println(persons.groupBy { it.age < 40 }) // {true=[John:27, Marry:16, Tom:33, James:33, Poly:33], false=[Jack:74, Alice:59, Peter:59, John:74]} println(persons.groupBy { it.name }) // {John=[John:27, John:74], Marry=[Marry:16], Tom=[Tom:33], Jack=[Jack:74], Alice=[Alice:59], James=[James:33], Poly=[Poly:33], Peter=[Peter:59]} println(persons.groupBy { it.name.first() }) // {J=[John:27, Jack:74, James:33, John:74], M=[Marry:16], T=[Tom:33], A=[Alice:59], P=[Poly:33, Peter:59]}