Заполните список в Kotlin с помощью цикла for - PullRequest
0 голосов
/ 18 января 2019

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

Вот моя функция:

fun convertRoomClass(course: List<Course>) : List<Courses> {

    lateinit var list : List<Courses>


    course.forEach {
        val id = it.pathID
        val name = it.pathName
        val desc = it.pathDescription

        val crs : Courses = Courses(id, name!!, desc!!)

         list = listOf(crs)
    }

    return list
}

Ответы [ 4 ]

0 голосов
/ 18 января 2019

Вы получаете список только с объектом, потому что функция listOf(crs) возвращает список всех объектов, которые передаются в качестве параметров. Сказав то же самое в Java, вы делаете что-то вроде этого:

for (course: Courses) {
    Course course = new Course(...);
    List<Course> list = new ArrayList<>();
    list.add(course);
    return list;
}

Как вы можете видеть, он создал новый список с одним объектом на одну итерацию. То, чего вы пытаетесь достичь, можно сделать с помощью оператора map{...}, который просто преобразует каждый объект в исходном списке с помощью кода, переданного внутрь map, и возвращает список преобразованных объектов

course.map{ Courses(...) }

Также я заметил, что вы используете оператор !! при создании объекта Courses. Возможно, потому что Course может иметь имя nullable, а Courses - нет. Я считаю это плохой практикой, потому что в этом случае вы говорите

Пожалуйста, добавьте Exception, если имя null.

Я думаю, что гораздо лучший подход - предоставить альтернативу, например:

val name = course.name ?: "default", сказав

Пожалуйста, используйте name или "default", если name равно null.

или пропустить объекты без имени, или любой другой подход, подходящий для вашей ситуации.

0 голосов
/ 18 января 2019

Ошибка в вашем коде в том, что вы создаете список на каждой итерации цикла. Сначала вы должны составить список, а затем добавить в него каждый элемент цикла!

fun convertRoomClass(courses: List<Course>) : List<AnotherCourseClass> {
    val newList = mutableListOf<AnotherCourseClass>()
    courses.forEach {
        val id = it.pathID
        val name = it.pathName
        val desc = it.pathDescription
        newList += AnotherCourseClass(id, name, desc)
    }
    return newList
}

Лучшее решение - использовать функцию карты

fun convertRoomClass(courses: List<Course>) = courses.map {
   AnotherCourseClass(it.pathID, it.pathDescription, it.pathDescription)
}
0 голосов
/ 18 января 2019

Вы можете использовать MutableList вместо List. Это позволяет вам добавлять новый элемент в конец списка, а не заменять весь список, выполнив: list = listOf(crs)

Итак, замените тип вашего var lateinit var list : List<Courses> на lateinit var list : MutableList<Courses>, затем замените list = listOf(crs) на list.add(crs)

Надеюсь, это поможет и весело провести время :) 1012 *

0 голосов
/ 18 января 2019

Возможно, вы ищете Kotlin Карта

Пример:

course.map { Courses(it.pathID, it.pathName,it.pathDescription) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...