加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala Case Class等于实现

发布时间:2020-12-16 18:27:42 所属栏目:安全 来源:网络整理
导读:鉴于以下课程: trait ModelWithId { var id: Long = 0}case class EntityAttribute ( val entityId: UUID,val attrName: String,val stringVal: Option[String],val boolVal: Option[Boolean],val longVal: Option[Long],val doubleVal: Option[Double],val
鉴于以下课程:

trait ModelWithId {
  var id: Long = 0
}
case class EntityAttribute  (
  val entityId: UUID,val attrName: String,val stringVal: Option[String],val boolVal: Option[Boolean],val longVal: Option[Long],val doubleVal: Option[Double],val byteVal: Option[Array[Byte]]) extends ModelWithId{
  override def toString() : String = {
"EntityAttribute(" + entityId.hashCode + "," + attrName.hashCode + "," +
  stringVal.map{_.hashCode}.getOrElse(None) + "," + stringVal.hashCode+ "," +
  boolVal.map{_.hashCode}.getOrElse(None) + "," + boolVal.hashCode+ "," +
  longVal.map{_.hashCode}.getOrElse(None) + "," + longVal.hashCode+ "," +
  doubleVal.map{_.hashCode}.getOrElse(None) + "," + doubleVal.hashCode+ "," +
  byteVal.map{_.hashCode}.getOrElse(None) +  ")"
  }
}

以下比较功能:

val newAtttributes : List[EntityAttribute]
val withoutIds : List[EntityAttribute]

println("without: " + withoutIds)
println("new:     " + newAtttributes)

  val differences = newAtttributes.diff(withoutIds)
  println("diff:    " + differences)
  if(newAtttributes.size == 1 && withoutIds.size == 1){
    println("==:      " + (newAtttributes.get(0) == withoutIds.get(0)))
    println("equals:  " + (newAtttributes.get(0).equals(withoutIds.get(0))))
    println("hequals: " + (newAtttributes.get(0).hashCode == withoutIds.get(0).hashCode))
  }

我得到了预期的差异输出99次100次.偶尔,diff函数将返回一个空列表,它应该是一个列表.

例:

without: List(EntityAttribute(428861607,-1147340381,None,120224,56,-356863126,None))
new:     List(EntityAttribute(428861607,23,424930523,None))
diff:    List()
==:      false
equals:  false
hequals: false

通常在大约10-18次迭代后,我可以可靠地重现此错误.这两个列表来自不同的来源,因此它们的构造方式不同.我猜它与自动装箱或者糟糕的hashCode实现有关,但我一直在抨击墙壁2天没有进展.

我正在使用scala 2.9.0-1.

解决方法

这两个EntityAttribute包含longVal的不同值.案例类的默认等于实现将所有成员考虑在内,因此使它们不相等.如果您只想使用成员的子集,则应定义自己的equals和hashCode.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读