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?
