Home > Net >  map a nested list to another nested list in Kotlin
map a nested list to another nested list in Kotlin

Time:09-08

I have a nested list of People : List<List<People.>>, where People has two attribute int age, String name. I want to map it to a nested list of Student, Student also has two attribute int age, String name. So the output is List<List<Student.>>.I have looked at examples of mapping a List to another, something like this:

fun List<People>.convert(): List<Student>{
   return this.map {
    Student(
      age = this.age,
      name = this.name
    )
   }
}

How to do it with a nested list? Thanks in advance.

CodePudding user response:

map is one of Kotlin's collection transformation operations. That link explains how it works.

Let's fix your List<People>.convert() function first. Here's one way to write it:

data class Person(val name: String, val age: Int)
data class Student(val name: String, val age: Int)

fun List<Person>.convert(): List<Student> {
    return this.map { person ->
        Student(
            age = person.age,
            name = person.name,
        )
    }
}

Note that inside the mapping function, this does not refer to anything, which is why your original code doesn't compile.

Since the mapping function we're passing to map has only one parameter, we can skip declaring the parameter, and refer to the argument by the special name it instead, like this:

fun List<Person>.convert(): List<Student> {
    return this.map { // it is Person
        Student(
            age = it.age,
            name = it.name,
        )
    }
}

Then, to convert a List<List<Person>> to a List<List<Student>> we could write:

val listsOfPeople: List<List<Person>> = listOf(
    listOf(Person("Alice", 27)),
    listOf(Person("Bob", 23), Person("Clarissa", 44))
)

val listsOfStudents: List<List<Student>> = listsOfPeople.map { // it is List<Person>
    it.convert()
}

Or, if you decide you don't need the convert function, you could write it like this:

val listsOfStudents: List<List<Student>> =
    listsOfPeople.map { // it is List<Person>
        it.map { // it is Person
            Student(it.name, it.age)
        }
    }
  • Related