比较没有ID的Kotlin中的数据类

我在Kotlin有一个数据类,它有多个属性,其中之一就是ID 。 但是当我真的在代码中使用compare函数时,我想在比较时排除这个ID属性。 有什么办法做,除了手动锅炉comparefunction?

您可以在其中一个数据类实例上使用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 )来获得所需的结果,至少它只包含一次相关的代码,而上面的代码解决方案可能会让你的课程变得复杂。