簡體   English   中英

Kotlin - 如何從數據類列表中更新特定值

[英]Kotlin - How to update particular value from a list of data class

我有一個 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 中的值。 需要一些關於如何更新 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 of Workers(其中key是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"

我更喜歡使用不變性而不是對數據類使用可變字段。

一個簡單的解決方案如下:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM