MohsenIT
MohsenIT

Reputation: 394

Nested groupBy in Kotlin

Is it possible to convert the following nested groupingBy to Kotlin Collections equivalent?

run this code: https://rextester.com/IYJ63609

fun main(args: Array<String>) {
    data class Person(val name: String, val city: String, val phone: String)

    val people = listOf(
            Person("John", "Boston", "+1-888-123456"),
            Person("Svyatoslav", "Saint-Petersburg", "+7-999-456700"),
            Person("Svyatoslav", "Saint-Petersburg", "+7-999-456789"),
            Person("Vasilisa", "Saint-Petersburg", "+7-999-123456"))

    val phoneBook = people.stream().collect(
      java.util.stream.Collectors.groupingBy(Person::city, 
        java.util.stream.Collectors.groupingBy(Person::name)
      )
    )
    println(phoneBook)
}

Upvotes: 0

Views: 1622

Answers (1)

Marvin
Marvin

Reputation: 14255

The order is a bit different but yes, it is possible:

fun main(args: Array<String>) {
    data class Person(val name: String, val city: String, val phone: String)

    val people = listOf(
            Person("John", "Boston", "+1-888-123456"),
            Person("Svyatoslav", "Saint-Petersburg", "+7-999-456700"),
            Person("Svyatoslav", "Saint-Petersburg", "+7-999-456789"),
            Person("Vasilisa", "Saint-Petersburg", "+7-999-123456"))

    val phoneBook = people.groupBy(Person::city)
                          .mapValues { (_, v) -> v.groupBy(Person::name) }
    println(phoneBook)
}

Upvotes: 5

Related Questions