【问题标题】:Populate a list in Kotlin with a for loop在 Kotlin 中使用 for 循环填充列表
【发布时间】:2019-06-12 14:52:59
【问题描述】:

我刚开始学习如何在 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
}

【问题讨论】:

    标签: android list for-loop kotlin


    【解决方案1】:

    您可能正在寻找 Kotlin Map

    示例:

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

    【讨论】:

      【解决方案2】:

      您的代码中的错误是您在循环的每次迭代中都创建了一个列表。您应该先制作列表,然后将循环中的每个项目添加到其中!

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

      更好的解决方案是使用地图功能

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

      【讨论】:

        【解决方案3】:

        您可以使用MutableList 代替列表。这使您可以在列表末尾附加新元素,而不是通过以下方式替换整个列表:list = listOf(crs)

        因此,将您的 var lateinit var list : List&lt;Courses&gt; 的类型替换为 lateinit var list : MutableList&lt;Courses&gt;,然后将 list = listOf(crs) 替换为 list.add(crs)

        希望它有所帮助并玩得开心:)

        【讨论】:

        • 谢谢你的回答:)
        • 不客气,很高兴你找到了解决方案 :)
        【解决方案4】:

        你得到的列表只有一个对象,因为函数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 不能。我认为这是一种不好的做法,因为在这种情况下你是在说

        如果名字是null,请抛出Exception

        我认为更好的方法是提供替代方案,例如:

        val name = course.name ?: "default",说

        如果namenull,请使用name"default"

        或跳过没有名称的对象,或任何其他适合您情况的方法。

        【讨论】:

        • 非常感谢您的回答和建议:)
        猜你喜欢
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 2021-02-14
        • 2023-01-14
        • 2017-10-30
        相关资源
        最近更新 更多