一段时间以来,我才刚刚开始学习如何在Kotlin中进行开发。 我正在处理此事情,我正在尝试将列表解析为另一种类型的列表。基本上,它们是同一件事,但名称不同。但是,当我尝试使用从函数中作为参数给出的列表中获取的数据填充新列表时,该列表仅填充了第一个对象。
这是我的功能:
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 :(得分:4)
您的代码中的错误是您在循环的每次迭代中都列出了一个列表。您应该先创建列表,然后将循环中的每个项目添加到列表中!
fun convertRoomClass(course: List<Course>) : List<Courses> {
val newList = mutableListOf<Courses>()
course.forEach {
val id = it.pathID
val name = it.pathName
val desc = it.pathDescription
newList += Courses(id, name!!, desc!!)
}
return newList
}
更好的解决方案是使用地图功能
fun convertRoomClass(course: List<Course>) = course.map {
Courses(it.pathID, it.pathDescription!!, it.pathDescription!!)
}
答案 1 :(得分:2)
答案 2 :(得分:0)
您可以使用MutableList代替列表。这样一来,您就可以在列表末尾添加新元素,而不必执行以下操作来替换整个列表:list = listOf(crs)
因此用lateinit var list : List<Courses>
替换变量lateinit var list : MutableList<Courses>
的类型,然后用list = listOf(crs)
替换list.add(crs)
希望它会有所帮助并带来乐趣:)
答案 3 :(得分:0)
您将获得仅包含一个对象的列表,因为函数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
。
或跳过没有名称的对象,或任何其他适合您情况的方法。