我想比较一个数据类的多个实例之间的值,以便我知道哪个值发生了变化:
data class A(val name : String)
val firstA = A("hello")
val secondA = A("you")
if (secondA.name.changed(firstA)) {
// Do something
}
我可以以某种方式访问
.name
的属性函数吗?并在没有明确定义的情况下在另一个目标值上执行它(在本例中是在 firstA 上)?代表可以在这里提供帮助,或者我如何在有和没有反射(reflection)的情况下解决这个问题?
最佳答案
没有反射
我找到了一种不使用反射的方法:
interface DiffValue<T> {
val old : T?
}
fun <T,R> T.changed(memberAccess : T.() -> R) : Boolean {
if (this is DiffValue<*>) {
val old = this.old as? T
if (old != null) {
val currentValue = with(this, memberAccess)
val previousValue = with(old, memberAccess)
return currentValue != previousValue
}
}
return true
}
这就是你如何使用它:
data class A(val val name: String, override val old : A? = null)
val firstA = A("hello")
val secondA = A("you", firstA)
if (secondA.changed {name}) {
// Do something
}
这是基于 lambda literals with receivers 的概念允许 Kotlin 构建强大的构建器和 DSL。
注意:
DiffValue
interface 是可选的,仅用于使值保持在一起更容易一些并避免 changed
中的附加参数.
关于reflection - Kotlin:使用(输出)反射比较不同目标对象的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46792185/