Kotlin - 如何更新数据列表中的特定值 class
Kotlin - How to update particular value from a list of data class
我有一个Worker的数据class,
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 class Worker 中的值。需要一些关于如何更新工人数据的指南。谢谢
您的数据 class 应该具有可变属性,以便可以更改它们:
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", "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"
我宁愿使用不变性而不是对数据使用可变字段 class。
一个简单的解决方案如下:
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)
我有一个Worker的数据class,
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 class Worker 中的值。需要一些关于如何更新工人数据的指南。谢谢
您的数据 class 应该具有可变属性,以便可以更改它们:
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", "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"
我宁愿使用不变性而不是对数据使用可变字段 class。
一个简单的解决方案如下:
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)