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]}