Ha pasado un tiempo desde que comencé a aprender a desarrollar en Kotlin. Hay algo en lo que estoy trabajando, estoy tratando de analizar una lista en otro tipo de lista. Básicamente son lo mismo pero con diferentes nombres. Pero cuando trato de completar la nueva lista con los datos que obtengo de la lista dada como parámetro en la función, la lista solo se completa con el primer objeto.
Aquí está mi función:
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 }
El error en su código es que está haciendo una lista en cada iteración del ciclo. ¡Primero debe hacer la lista y luego agregarle todos los elementos del ciclo!
fun convertRoomClass(courses: List<Course>) : List<AnotherCourseClass> { val newList = mutableListOf<AnotherCourseClass>() courses.forEach { newList += AnotherCourseClass(it.pathID, it.pathName, it.pathDescription) } return newList }
Una mejor solución es usar la función de mapa
fun convertRoomClass(courses: List<Course>) = courses.map { AnotherCourseClass(it.pathID, it. pathName, it.pathDescription) }
Está obteniendo la lista solo con un objeto, porque la función listOf(crs)
devuelve una lista de todos los objetos que se pasan como parámetros. Al decir lo mismo en Java
, estás haciendo algo como esto:
for (course: Courses) { Course course = new Course(...); List<Course> list = new ArrayList<>(); list.add(course); return list; }
Como puede ver, creó una nueva lista con un solo objeto por iteración. Lo que está tratando de lograr, se puede hacer con el map{...}
que simplemente transforma cada objeto en la lista inicial usando el código pasado dentro del map
y devuelve la lista de objetos transformados
course.map{ Courses(...) }
Además, he notado que estás usando el !!
operador al crear un objeto Courses
. Probablemente porque el Course
puede tener un nombre nullable
, mientras que los Courses
no. Estoy considerando esto como una mala práctica, porque en este caso estás diciendo
Lance una
Exception
si el nombre esnull
.
Creo que un enfoque mucho mejor es proporcionar una alternativa, como:
val name = course.name ?: "default"
, diciendo
Utilice el
name
o"default"
si elname
esnull
.
u omitir objetos sin nombre, o cualquier otro enfoque que se adapte a su situación.