Funkce groupBy v Kotlinu

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

Napsat komentář