是否有自定义比较器的retainAll()实现?

时间:2011-10-17 14:53:26

标签: java collections filter comparator

我需要根据其他收藏集的内容筛选收藏集。通常,我会使用Collection.retainAll()方法。
不幸的是,我处理的域对象的相等性是相当不稳定的,这取决于比较上下文。因此,我不能依赖equals/hashCode

我的下一个反应是使用自定义Comparator,但我无法找到支持我的想法的任何方法。实现功能不是问题,但我想在这里重新发明轮子。

我是否遗漏了API中的内容?其他类似框架(不太太深奥)也很受欢迎。
如果没有,那么优化会使我直截了当(通过遍历n ^ 2中两个集合中的所有项目,在两个集合中创建所有对象的列表)一个好的?

3 个答案:

答案 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,但不幸的是,番石榴团队建议应采取上述路线。