我需要根据其他收藏集的内容筛选收藏集。通常,我会使用Collection.retainAll()
方法。
不幸的是,我处理的域对象的相等性是相当不稳定的,这取决于比较上下文。因此,我不能依赖equals/hashCode
。
我的下一个反应是使用自定义Comparator
,但我无法找到支持我的想法的任何方法。实现功能不是问题,但我想在这里重新发明轮子。
我是否遗漏了API中的内容?其他类似框架(不太太深奥)也很受欢迎。
如果没有,那么优化会使我直截了当(通过遍历n ^ 2中两个集合中的所有项目,在两个集合中创建所有对象的列表)一个好的?
答案 0 :(得分:3)
建议使用Guava's filter。另一种方法是推出自己的retainAllBy(sourceCollection, Comparator)
。
答案 1 :(得分:1)
我错过了API的内容吗?
Java Collection Framework中没有任何内容可以通过标准retainAll
实现来执行equals
。
强烈依赖于您的用例,您可以这样做:
创建一个包装器对象,可以使用您需要的equals
方法包装对象。然后使用该包装器执行retainAll
之后,您需要从生成的集合中解包对象。
但这种方式有两个缺点:
equals
方法仍然是java doc for equals方法的有效等于方法,它只能正常工作。答案 2 :(得分:1)
Guava对此问题(Equivalence
概念)有一个繁琐的解决方案。使用Equivalence.wrap()
将对象包装在等价中,将包装的版本存储在集合中,从而使集合使用自定义的equals / hashcode逻辑。
我(和其他人)要求Equivalence-based sets and maps,但不幸的是,番石榴团队建议应采取上述路线。