Java:我如何使用equals的不同定义执行列表操作?
Java:我如何使用equals的不同定义执行列表操作?
我有两个通用POJO列表。 我需要根据比较列表中的POJO的不同方式对列表执行一些设置操作。
例如,如果我的POJO具有以下结构:
public class GenericPojo {
private String id;
private String address;
private String city;
private String country;
private String extraDetails;
}
(有适当的获得者和安装者)
给定List1<GenericPojo>
和List2<GenericPojo>
,我将如何找到:
List1 - List2(如果只有ID相等,则GenericPojo
类相等)
List1和List2的相交(其中id
, address
, city
, country
,但不是GenericPojo
extraDetails
相等)
两个不同的自定义比较类会有帮助吗? 是否有任何库能够有效处理这些操作,还是应该尝试实现我自己的?
如果你必须控制班级,我会建议使用委派。 这是我的尝试:
RichList<T>
围绕包装List
小号实施List
合同的基础上,装饰图案。 EqualityChecker<T>
接口。 EqualityChecker<T>
具体实例,它将为你进行相等性测试。 因此,您可以将两种操作都添加到已写入EqualityChecker
任何种类的对象的所有现有List
。
进一步的改进:您也可以编写一个默认的EqualityChecker<T>
,它只是调用比较对象的equals方法。 然后,您可以将两个新操作重载为默认EqualityChecker
。
如果您的列表不包含重复项(并且声明自定义比较器类),则可以使用两个TreeSet,分别用两个比较器实例化。
这个(除了重复约束)的缺点是迭代元素时得到的顺序取决于比较器。
鉴于您对平等的具体要求, List#removeAll()
和List#retainAll()
将不符合您的需求,所以我认为您需要一个自定义实现来执行与这两种操作类似的操作。
上一篇: Java: How do I perform list operations with different definitions of equals?
下一篇: How can I safely solve this Java context classloader problem?