我在Kotlin中有一个数据类别,它有多个属性,其中之一是ID
。但是当我在代码中实际使用compare
函数时,我想在比较时排除此ID
属性。有没有办法做到这一点,除了手动锅炉功能compare
功能?在没有ID的情况下在Kotlin中比较数据类别
0
A
回答
1
您可以在其中一个数据类实例上使用copy()
function来创建它的副本“更改某些的属性”。例如: -
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()
不必要的电话。
1
数据类产生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
(and by implication, hashCode
)以获得所需的结果,至少它只包含一次与此相关的代码,而上述解决方案可能会让您的课程变得复杂。
+0
哇,这一切都不写'equals'? – voddan
相关问题
- 1. 比较在两种情况下
- 2. 避免在没有数据的情况下在mongoDB中插入
- 3. 在没有ORM的情况下在Python中使用数据库
- 4. 在没有Vlookup的情况下匹配数组中的数据
- 5. 如何在没有数据库的情况下收集数据
- 6. 在没有'foreach'的情况下检索Webmatrix中的数据
- 7. 在没有别名的情况下获取Joomla中的链接?
- 8. 在有或没有索引的情况下复制数据库?
- 9. 在没有OutOfMemoryError的情况下加载较大的图像
- 10. 为什么在以下情况下没有数据竞争?
- 11. 特殊情况下插入排序的最坏情况比较
- 12. 在没有数据库的情况下在C#中构建业务类别集合
- 13. 在没有bodyParser的情况下从AngularJS的Node.js请求数据
- 14. 我可以在没有ID的情况下放入吗?
- 15. 如何在没有id的情况下使用innerHTML HTML标签?
- 16. 如何在没有连接的情况下获得FB ID
- 17. 在没有ID的情况下更改特定实例
- 18. 如何在没有ID的情况下单击按钮?
- 19. 如何在没有表单的情况下发布数据
- 20. Ember数据:在没有商店的情况下创建模型
- 21. .appendChild(tr)在没有数据的情况下创建tr
- 22. Python在没有预期的情况下返回数据
- 23. ASP.NET如何在没有GridView的情况下显示数据
- 24. 在没有for循环的情况下操作数据帧
- 25. CoreData数据库在没有iCloud的情况下同步?
- 26. 在没有测试数据的情况下找到段错误
- 27. 在没有参考的情况下保留数据
- 28. 如何在没有索引号的情况下获取数据
- 29. 在没有GroupBy的情况下对数据使用FixedWindows
- 30. 在没有数据库的情况下运行Drupal 7网站
这看起来像我正在寻找的。我可以在1行中实现数据类本身的这种比较方法。谢谢。 – arslancharyev31