Foo 对象的两组,s1 和 s2,其中
case class Foo(id: Long, attri01: String) {
override def hashCode: Int = {
val prime = 41
prime * attri01.hashCode
}
override def equals(o: Any): Boolean = o match {
case Foo(_, attri01) => attri01 == this.attri01
case => false
}
}
等于和哈希代码方法被覆盖用于数据比较。
现在,我需要找出 s1 中的所有对象,而不是 s2 中的所有对象。我不能使用
s1.diff(s2)
由于等于/哈希代码方法覆盖。它可能会使用过滤器
s1.filter(_.id ...)
或者创建一个映射,其中 ID 字段作为其键,其对象作为第一个集合的值,并删除第二个集合中的任何条目。
用 Scala 的方式解决这个问题的好方法是什么?
更新:
我在想下面这样的事情:
val set2IDs = s2.map(a => a.id)
val result = s1.map(Foo(id, _) => !set2IDs.contains(id))
但是,第二行代码不起作用。
case class FooWrapper(id:Long)(val foo:Foo)
def wrap(foo:Foo) = new FooWrapper(foo.id)(foo)
val result = s1.map(wrap).diff(s2.map(wrap)).map(_.foo)