4
votes

Remplir une liste dans Kotlin avec une boucle for

Cela fait un moment que je viens de commencer à apprendre à développer dans Kotlin. Il y a cette chose sur laquelle je travaille, j'essaye d'analyser une liste dans un autre type de liste. En gros, ce sont la même chose mais avec des noms différents. Mais lorsque j'essaie de remplir la nouvelle liste avec les données que j'obtiens de la liste donnée en paramètre dans la fonction, la liste n'est remplie qu'avec le premier objet.

Voici ma fonction:

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
}


0 commentaires

4 Réponses :


6
votes

Vous recherchez peut-être la carte de Kotlin. p> Exemple:

course.map { Courses(it.pathID, it.pathName,it.pathDescription) }


0 commentaires

15
votes

L'erreur dans votre code est que vous faites une liste à chaque itération de la boucle. Vous devez d'abord créer la liste, puis y ajouter tous les éléments de la boucle!

fun convertRoomClass(courses: List<Course>) = courses.map {
   AnotherCourseClass(it.pathID, it. pathName, it.pathDescription)
}

Une meilleure solution consiste à utiliser la fonction map

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


0 commentaires


1
votes

Vous obtenez la liste avec uniquement un objet, car la fonction listOf (crs) retourne une liste de tous les objets qui sont passés en paramètre. En disant la même chose en Java , vous faites quelque chose comme ceci:

course.map{ Courses(...) }

Comme vous pouvez le voir, il a créé une nouvelle liste avec un seul objet par itération. Ce que vous essayez d'accomplir peut être fait avec l'opérateur map {...} qui transforme simplement chaque objet de la liste initiale en utilisant le code passé dans map et renvoie la liste d'objets transformés

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

De plus, j'ai remarqué que vous utilisez l'opérateur !! lors de la création d'un Courses code > objet. Probablement parce que le Course peut avoir un nom nullable , alors que Courses ne le peut pas. Je considère cela comme une mauvaise pratique, car dans ce cas, vous dites

Veuillez lancer une Exception si le nom est null .

Je pense qu'une bien meilleure approche est de fournir une alternative, comme:

val name = course.name?: "default" , en disant

Veuillez utiliser nom ou "default" si le nom est null .

ou sauter des objets sans nom, ou toute autre approche qui convient à votre situation.


1 commentaires

Merci beaucoup pour la réponse et les suggestions :)