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

Java 是否有使用自定义比较器的retainAll()实现?,java,collections,filter,comparator,Java,Collections,Filter,Comparator,我需要根据其他收藏的内容筛选收藏。通常,我会使用Collection.retainal()方法。 不幸的是,我处理的域对象的相等性相当不稳定,这取决于比较上下文。因此,我不能依赖equals/hashCode我的下一个反射是使用自定义的比较器,但我找不到任何方法来支持我的想法。实现功能不是问题,但我想在这里重新发明轮子。我是否错过了API中的某些内容?其他框架(不太深奥)如commons也很受欢迎。如果不是,有什么优化可以使我的直接impl(通过在n^2中检查两个集合的所有项来创建两个集合中所有

我需要根据其他收藏的内容筛选收藏。通常,我会使用
Collection.retainal()
方法。

不幸的是,我处理的域对象的相等性相当不稳定,这取决于比较上下文。因此,我不能依赖
equals/hashCode


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

我是否错过了API中的某些内容?其他框架(不太深奥)如commons也很受欢迎。
如果不是,有什么优化可以使我的直接impl(通过在n^2中检查两个集合的所有项来创建两个集合中所有对象的列表)成为一个好的

我是否错过了API中的某些内容

Java集合框架中没有任何东西可以通过标准
等于
实现来执行
保留


根据您的用例,您可以这样做:

创建一个包装器对象,该对象可以围绕对象进行包装,但需要使用
equals
方法。然后使用包装器执行
retainAll
,然后需要从结果集合中展开对象

但这种方式有两个缺点:

  • 将创建许多对象
  • 仅当包装器的
    equals
    方法在方法方面仍然是有效的equals方法时,它才正确工作
    • 对于这个问题有一个麻烦的解决方案,即概念。您可以使用将对象包装成等价形式,将包装后的版本存储在集合中,从而使集合使用自定义的equals/hashcode逻辑


      我(和其他人)提出了要求,但不幸的是,番石榴团队建议改为采用上述路线。

      建议使用。另一种选择是通过(sourceCollection,Comparator)

谢谢,我几乎可以肯定Collection/s API本身,但就是不敢相信:)也许还有另一种可能性(比如commons或类似的东西)。我更新了这个问题,将其扩展到其他libs+1:这就是我在编写时寻找的API。核心javas中没有支持。使用我那生锈的n^2迭代方法,听起来相当复杂,让我感觉很舒服;)非常感谢。番石榴看起来确实值得付出努力。可以通过使用谓词包装集合,然后进行过滤来完成。听起来不错。非常感谢。