【问题标题】:Kotlin - How to update particular value from a list of data classKotlin - 如何从数据类列表中更新特定值
【发布时间】:2020-10-28 07:20:54
【问题描述】:

我有一个 Worker 的数据类,

data class Worker(val id: Int, val name:String, val gender :String, val age :Int, val tel:String,val email:String)

以及工人名单

List<Worker> = listOf(workerA, workerB)

我想写一个函数来更新Worker的数据,例如:

updateWorkerData(1, age, 28)

//'type' refer to name, gender, age ..
//'value' refer AA, Female, 27 ..
fun updateWorkerData(id: Int, type: Any, value: Any) {
  val workers = getListOfWorker()
  workers.forEach {
  if (it.id == id) {
   //here is where I stuck    
  }    
}
}

我不知道如何将类型引用到 Data 类 Worker 中的值。需要一些关于如何更新 Worker 数据的指南。谢谢。

【问题讨论】:

    标签: android kotlin data-class


    【解决方案1】:

    您的数据类应该具有可变属性,以便可以更改它们:

    data class Worker(val id: Int, var name: String, var gender: String, var age: Int, var tel: String, var email: String)
    

    然后您可以将 KProperty 传递给可以更改该属性的函数:

    fun <T> updateWorkerData(id: Int, property: KMutableProperty1<Worker, T>, value: T) {
        val workers = getListOfWorker()
        workers.forEach {
            if (it.id == id) {
                property.set(it, value)
            }
        }
    }
    
    updateWorkerData(1, Worker::age, 28)
    

    【讨论】:

    • 它可以工作,虽然我不能真正理解!无论如何,在实施您的答案时,它会显示错误:“Kotlin 反射不可用”。我添加后错误消失了:将“org.jetbrains.kotlin:kotlin-reflect:$kotlin_version”实现到gradle中。谢谢!
    【解决方案2】:

    我更喜欢使用不变性而不是对数据类使用可变字段。

    一个简单的解决方案如下:

    fun List<Worker>.updateWorkerDataAge(id: Int, age: Int): List<Worker> =
            this.map { worker -> if (worker.id == id) worker.copy(age = age) else worker }
    

    你可以使用它:

    val newWorkerList = workerList.updateWorkerDataAge(2, 99)
    

    【讨论】:

      【解决方案3】:

      Animesh 的回答是正确的,我只是想指出,使用 Workers 的 Map 可能更简单(其中关键是工人 ID),直接编辑工人,而不是聪明地(和难以理解)有反射的东西:

      val workers: Map<Int, Worker> = listOf(
          Worker(1, "a", "a", 1, "a", "a"),
          Worker(2, "b", "b", 2, "b", "b"),
          Worker(3, "c", "c", 3, "c", "c"),
      ).map { it.id to it }.toMap()
      
      // Worker 1 changes name
      workers.getValue(1).name = "Slartibartfast"
      
      // Worker 2 gets older
      workers.getValue(2).age += 1
      
      // Worker 3 changes email
      workers.getValue(3).email = "newemail@example.com"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 2014-03-10
        • 2021-09-24
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多