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
}
4 Réponses :
Vous recherchez peut-être la carte de Kotlin. p> Exemple:
course.map { Courses(it.pathID, it.pathName,it.pathDescription) }
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
}
Vous pouvez utiliser MutableList a> au lieu de List. Cela vous permet d'ajouter un nouvel élément à la fin de votre liste au lieu de remplacer la liste entière en faisant: list = listOf (crs)
Remplacez donc le type de votre var lateinit var list: List par lateinit var list: MutableList puis remplacez list = listOf ( crs) par list.add(crs)
J'espère que cela aide et amusez-vous :)
Merci pour la réponse :)
Vous êtes les bienvenus, je suis heureux que vous ayez trouvé une solution :)
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
Exceptionsi le nom estnull.
Je pense qu'une bien meilleure approche est de fournir une alternative, comme:
val name = course.name?: "default" , en disant
Veuillez utiliser
nomou"default"si lenomestnull.
ou sauter des objets sans nom, ou toute autre approche qui convient à votre situation.
Merci beaucoup pour la réponse et les suggestions :)