我在Kotlin中有一个数据类,它有许多属性,其中一个是ID
。但是当我在代码中实际使用compare
函数时,我想在比较时排除这个ID
属性。有没有办法做到这一点,除了手动焊接compare
函数?
答案 0 :(得分:2)
数据类根据主构造函数中声明的属性生成equals
函数(未生成compare
),因此如果您不希望它比较ID,那么您需要&#39 ; ll必须将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
(and by implication, hashCode
)以获得所需的结果,至少它只包含与此相关的代码,而上述解决方案可能会使您的课程复杂化。
答案 1 :(得分:1)
您可以在其中一个数据类实例上使用copy()
function来创建它的副本,然后更改某些的属性"。 e.g:
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()
的不必要的调用。