【问题标题】:List.retainAll() not working as expected (grails 2.3.9)List.retainAll() 没有按预期工作(grails 2.3.9)
【发布时间】:2015-03-04 14:27:42
【问题描述】:

我几乎可以肯定做错了什么或误解了 List.retainAll()。

我有两个相等的列表 (size() ==1),但是当我调用 list1.retainAll(list2) 时,列表 1 变为空。

代码:

List<DomainObject> list1 = someService.getData()
List<DomainObject> list2 = someService.getOtherData()
log.info("Equal: ${list1.equals(list2)}") 
boolean changed = list1.retainAll(list2)
log.info("Changed: ${changed}")
log.info("list1 empty: ${list1.isEmpty()}")

日志显示:

Equal: true
Changed: true
list1 empty: true

我……不知道我做错了什么。我已经用更通用的对象运行了测试(实际的域对象相当复杂,但是正确地实现了 equals/hashcode)并且 retainAll 按预期工作。

我什至不确定我应该问什么具体问题...是否存在我缺少的条件,其中 equals() 可以返回 true 但 retainAll() 失败?

【问题讨论】:

  • 您能否展示您的 equalshashCode 实现 - 在存在延迟加载代理的情况下,您必须在 @ 中非常小心一些事情987654325@ 实施,比平时更多。
  • 我继续努力,最终开始比较每个List 的第一个元素,结果不是equal(尽管让我感到困惑的是,列表被评估为equal当第一个元素没有时。equals() 方法使用 if(getClass() != o.class) return false 失败,因为 o.class 是 javaassist 对象。

标签: grails groovy


【解决方案1】:

希望能帮助其他人,这是我应该知道并遇到过的事情。

list1.equals(list2) //true, one element per list
list1.get(0).id == list2.get(0).id //true, same DB object
list1.get(0).equals(list2.get(0))  //false...  ?!

原因是equals()是从以下开始实现的:

equals() {  
    if(getClass() != o.class) return false
}

getClass() 返回 DomainObject,但 o.class(或 o.getClass())返回 javaassist__blahblah

我把支票换成了

if(!(o instanceof DomainObject)) return false

不确定这是否是在 equals 中进行类检查的最干净的方法,出于某种原因,我觉得 instanceof 很慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多