Es ist eine Weile her, dass ich gerade angefangen habe zu lernen, wie man sich in Kotlin entwickelt. Es gibt diese Sache, an der ich arbeite. Ich versuche, eine Liste in eine andere Art von Liste zu zerlegen. Im Grunde sind sie dasselbe, aber mit unterschiedlichen Namen. Wenn ich jedoch versuche, die neue Liste mit den Daten zu füllen, die ich aus der als Parameter in der Funktion angegebenen Liste erhalte, wird die Liste nur mit dem ersten Objekt gefüllt.

Hier ist meine Funktion:

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
}
7
Jona 18 Jän. 2019 im 13:44

4 Antworten

Beste Antwort

Der Fehler in Ihrem Code besteht darin, dass Sie in jeder Iteration der Schleife eine Liste erstellen. Sie sollten zuerst die Liste erstellen und dann jedes Element aus der Schleife hinzufügen!

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

Eine bessere Lösung ist die Verwendung der Kartenfunktion

fun convertRoomClass(courses: List<Course>) = courses.map {
   AnotherCourseClass(it.pathID, it.pathDescription, it.pathDescription)
}
11
Ahmed Hegazy 20 Dez. 2019 im 10:14

Möglicherweise suchen Sie nach Kotlin Map

Beispiel:

course.map { Courses(it.pathID, it.pathName,it.pathDescription) }
5
Milind Mevada 18 Jän. 2019 im 10:48

Sie erhalten die Liste nur für ein Objekt, da die Funktion listOf(crs) eine Liste aller Objekte zurückgibt, die als Parameter übergeben werden. Wenn Sie dasselbe in Java sagen, tun Sie so etwas:

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

Wie Sie sehen können, wurde eine neue Liste mit einem einzelnen Objekt pro Iteration erstellt. Was Sie erreichen möchten, können Sie mit dem Operator map{...} ausführen, der einfach jedes Objekt in der Anfangsliste mithilfe des in map übergebenen Codes transformiert und eine Liste der transformierten Objekte zurückgibt

course.map{ Courses(...) }

Außerdem habe ich festgestellt, dass Sie beim Erstellen eines Courses -Objekts den Operator !! verwenden. Wahrscheinlich, weil Course den Namen nullable haben kann, während Courses dies nicht kann. Ich betrachte dies als eine schlechte Praxis, denn in diesem Fall sagen Sie

Bitte werfen Sie ein Exception, wenn der Name null ist.

Ich denke, dass ein viel besserer Ansatz darin besteht, eine Alternative bereitzustellen, wie:

val name = course.name ?: "default" und sagt

Bitte verwenden Sie name oder "default", wenn name null ist.

Oder überspringen Sie Objekte ohne Namen oder einen anderen Ansatz, der Ihrer Situation entspricht.

1
Demigod 18 Jän. 2019 im 11:17

Sie können stattdessen MutableList verwenden der Liste. Auf diese Weise können Sie ein neues Element am Ende Ihrer Liste anhängen, anstatt die gesamte Liste durch Folgendes zu ersetzen: list = listOf(crs)

Ersetzen Sie also den Typ Ihrer var lateinit var list : List<Courses> durch lateinit var list : MutableList<Courses> und ersetzen Sie list = listOf(crs) durch list.add(crs)

Hoffe es hilft und viel Spaß :)

0
Guillaume Monrolin 18 Jän. 2019 im 10:57