Почему kotlin map.indexed возвращает List <Any>вместо List <MyObject> - PullRequest
0 голосов
/ 19 декабря 2018

Я немного играю с Kotlin, и я не понимаю этого, поэтому, может быть, кто-то может мне это объяснить.

У меня есть класс данных:

data class Person (var name : String, var age : Int)

И я хочу создать Список, который содержит Человека с умноженным возрастом, умноженным на 2, только на четные предметы.Поэтому я создал новый список и создал из него mutableList, потому что я хочу изменить их возраст.Я сделал это следующим образом:

    val personA = Person("john", 25)
    val personB = Person("Ane", 10)
    val personC = Person("will", 20)
    val personList = listOf(personA, personB, personC)
    var mutablePersons = mutableListOf<Person>()
    mutablePersons.addAll(personList)

И теперь я пытаюсь создать новый список с измененными элементами из mutablePersons .Итак, я уже сделал следующее:

val mutablePersonsAgeChanged = mutablePersons.mapIndexed { index, person ->
        if (index.rem(2) == 0) {
            person.age = person.age * 2
        }
    }

И ... что-то у меня не получается, потому что mutablePersonAgeChanged равно List<Any> и я хочу List<Person>.

Итак, мой вопрос.Что я делаю не так?Как сделать эту карту индексированной Возвращает List<Person>

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

В вашем случае функция, переданная в качестве параметра mapIndexed, была выведена в Any, потому что вы пропустили ветку else вашего оператора if.Кроме того, я хотел бы отметить, что mapIndexed похож на map, но с index элемента, поэтому вам нужно передать функцию, которая преобразует каждый элемент.

Пример

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

val personList = listOf(
    Person("John", 25), 
    Person("Ane", 10), 
    Person("will", 20)
)

val personListAgeChanged = personList.mapIndexed { index, person ->
    if (index.rem(2) == 0) person.copy(age = person.age*2)
    else person
}

println(personListAgeChanged)

Выход

[Персона (имя = Джон, возраст = 50), Персона (имя = Ан, возраст = 10),Персона (имя = воля, возраст = 40)]

В этом случае вы передаете функцию, которая удваивает возраст каждого человека в списке, обратите внимание, что никогда не изменяются никакие переменные или списки,который должен быть предпочтительным подходом.

0 голосов
/ 19 декабря 2018

mapIndexed передаст каждый элемент и его индекс в лямбду.Затем он добавляет результат Lambda в новый список.В вашем случае возвращаемое значение лямбды - if (так как большинство элементов являются выражениями в Kotlin).

Результатом if является либо Единица в случае индекса% 2 ==0, потому что установщик для возраста возвращает Единицу.

Если if имеет значение false, он также вернет Единицу.

Чтобы исправить это, вам необходимо вернуть person в концекарты.

Так что, если вы сделали свой код, как показано ниже, он будет работать.

val mutablePersonsAgeChanged = mutablePersons.mapIndexed { index, person ->
    if (index.rem(2) == 0) {
        person.age = person.age * 2
    }
    person
}

Также нет необходимости создавать List, а затем добавлять все элементы в mutableList.Просто измените listOf(personA, personB, personC) на mutableListOf(personA, personB, personC)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...