List.retainAll() 未按预期工作(grails 2.3.9)
List.retainAll() not working as expected (grails 2.3.9)
我几乎可以肯定做错了什么或误解了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() 可以 return 为真但 retainAll() 失败的条件?
希望能帮助其他人,这是我应该知道的,并且 运行 之前就知道了。
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
不确定这是否是最干净的方式 class 签入 equals,出于某种原因,我的印象是 instanceof
很慢。
我几乎可以肯定做错了什么或误解了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() 可以 return 为真但 retainAll() 失败的条件?
希望能帮助其他人,这是我应该知道的,并且 运行 之前就知道了。
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
不确定这是否是最干净的方式 class 签入 equals,出于某种原因,我的印象是 instanceof
很慢。