比较没有ID的Kotlin中的数据类
我在Kotlin有一个数据类,它有多个属性,其中之一就是ID
。 但是当我真的在代码中使用compare
函数时,我想在比较时排除这个ID
属性。 有什么办法做,除了手动锅炉compare
功能?
您可以在其中一个数据类实例上使用copy()
函数来创建“更改其某些属性”的副本。 例如:
data class User(val id: Long, val name: String) val a = User(1, "John") val b = User(2, "John") println(a == b) // false println(a.copy(id = b.id) == b) // true
创建其中一个数据类实例的副本,并将id更改为与要比较的另一个实例相同,可以有效地忽略该属性。
你也可以复制两个数据类的实例,并设置id
为一些共同的价值,但如果你只做一次性比较,那么这将是一个不必要的调用copy()
。
数据类根据主构造函数中声明的属性生成equals
函数(不会生成compare
),所以如果您不想比较这些ID,则必须将ID
属性移出主构造函数。
最明显的部分是你必须将属性移动到类的主体,但是你也必须使它成为一个var
因为它不会在主构造函数中初始化(你不能成为一个val
并将其初始化为init
块中的默认值,因为在二级构造函数中不能分配给它)。
一个如何做到这一点的例子:
data class User(val id: Long, val name: String) data class ModifiedUser(val name: String) { var id: Long = 0 constructor(id: Long, name: String) : this(name) { this.id = id } } val u1 = User(1, "John") val u2 = User(2, "John") println(u1 == u2) // false val m1 = ModifiedUser(1, "Sally") val m2 = ModifiedUser(2, "Sally") println(m1 == m2) // true
这取决于你决定哪种方式更适合你,但也许最简单的方法就是覆盖equals
( 以及暗示, hashCode
)来获得所需的结果,至少它只包含与此相关的代码,而上述解决方案可能会使你的课程复杂化一点。