Попытка написать функцию патча для классов данных в kotlin

Здесь моя проблема.

Допустим, у нас есть data classUser

data class User(var name: String? = null, var age: Int? = null)

И у нас есть 4 пользовательских объекта

val oldUser = User("user1", 10)
val newUser1 = User("user2", null)
val newUser2 = User(null, 60)
val newUser3 = User(null, null)

Я хочу написать функцию расширения patch, что занимает 2 User объекты (или любой другой класс данных) и возвращает другого пользователя, который создается путем применения патча второго Userнепустые поля на первом.

поэтому для вышеуказанных объектов функция исправления должна вести себя следующим образом:

oldUser.patch(newUser1) //returns User("user2", 10) (name is changed)
oldUser.patch(newUser2) //returns User("user1", 60) (age is changed)
oldUser.patch(newUser3) //returns User("user1", 10) (no change)

Решение, которое я мог бы найти до сих пор, включает отражение и модификацию приемника. User, Вот код для этого.

inline fun <reified T : Any> T.patch(new: T): T {
    T::class.memberProperties
        .filterIsInstance<KMutableProperty<*>>().forEach { field ->
            field.getter.call(new)?.let { field.setter.call(this, it) }

        }
    return this
}

Как я могу написать универсальную функцию расширения, которая может достигать вышеуказанного поведения и не изменяет исходный объект?

0 ответов

Другие вопросы по тегам