Kotlin-如何从数据类列表中更新特定值

问题描述

我有一个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    
  }    
}
}

我在如何将类型引用到数据类Worker中的值上感到困惑。需要一些有关如何更新工作人员数据的指南。谢谢。

解决方法

您的数据类应具有可变属性,以便可以对其进行更改:

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)
,

Animesh的答案是正确的,我只想指出,使用Map个Workers(其中的键是worker ID)可能更简单,而直接编辑Workers而不是做得很聪明(而且很难理解)带有反思的事物:

val workers: Map<Int,Worker> = listOf(
    Worker(1,"a",1,"a"),Worker(2,"b",2,"b"),Worker(3,"c",3,"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 = "[email protected]"