比较Kotlin中没有ID的数据类

时间:2017-04-03 19:15:46

标签: kotlin

我在Kotlin中有一个数据类,它有许多属性,其中一个是ID。但是当我在代码中实际使用compare函数时,我想在比较时排除这个ID属性。有没有办法做到这一点,除了手动焊接compare函数?

2 个答案:

答案 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

由您决定哪种方式更适合您,但最简单的方法是覆盖equalsand 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()的不必要的调用。