java 8 将 ListB 的所有元素合并到 ListA 中(如果不存在)
我需要将 listB 的所有元素合并到另一个 list listA 中。
如果 listA 中已经存在一个元素(基于自定义相等检查),我不想添加它。
我不想使用 Set,也不想覆盖 equals() 和 hashCode()。
原因是,我不想阻止listA本身的重复,我只想不从listB合并,如果listA中已经存在我认为相等的元素。
我不想覆盖 equals() 和 hashCode(),因为这意味着我需要确保,我对元素的 equals() 实现在任何情况下都成立。但是,列表 B 中的元素可能未完全初始化,即它们可能缺少对象 ID,而该对象 ID 可能存在于 listA 的元素中。
我目前的方法涉及一个接口和一个实用程序函数:
public interface HasEqualityFunction<T> {
public boolean hasEqualData(T other);
}
public class AppleVariety implements HasEqualityFunction<AppleVariety> {
private String manufacturerName;
private String varietyName;
@Override
public boolean hasEqualData(AppleVariety other) {
return (this.manufacturerName.equals(other.getManufacturerName())
&& this.varietyName.equals(other.getVarietyName()));
}
// ... getter-Methods here
}
public class CollectionUtils {
public static <T extends HasEqualityFunction> void merge(
List<T> listA,
List<T> listB) {
if (listB.isEmpty()) {
return;
}
Predicate<T> exists
= (T x) -> {
return listA.stream().noneMatch(
x::hasEqualData);
};
listA.addAll(listB.stream()
.filter(exists)
.collect(Collectors.toList())
);
}
}
然后我会这样使用它:
...
List<AppleVariety> appleVarietiesFromOnePlace = ... init here with some elements
List<AppleVariety> appleVarietiesFromAnotherPlace = ... init here with some elements
CollectionUtils.merge(appleVarietiesFromOnePlace, appleVarietiesFromAnotherPlace);
...
在 listA 中获取我的新列表,其中所有元素都从 B 合并。
这是一个好方法吗?有没有更好/更简单的方法来完成同样的事情?