Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I have a data class of Worker,

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

and a list of workers

List<Worker> = listOf(workerA, workerB)

I want to write a function to update the data of Worker, e.g.:

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    
  }    
}
}

I'm stuck on how to refer the type to the value in Data class Worker. Need some guide on how to update the Worker's data. Thanks.

like image 480
scr Avatar asked Oct 17 '25 05:10

scr


2 Answers

I would prefer to use immutability instead of using mutable fields for a data class.

A simple solution is the following:

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

and you can use it:

val newWorkerList = workerList.updateWorkerDataAge(2, 99)
like image 183
Diego Novati Avatar answered Oct 19 '25 19:10

Diego Novati


Your data class should have mutable properties, so that they can be changed:

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

Then you can pass out the KProperty to the function that can change that propety:

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)
like image 41
Animesh Sahu Avatar answered Oct 19 '25 19:10

Animesh Sahu