兩種方法:
1.集合相減可以使用阿帕奇的一個ListUtils.subtract(list1,list2)方法,這種方法實現必須重寫集合中對象的屬性的hashCode和equals方法,集合相減判斷的會調用equals方法,
這種方法的好處是可以重寫多個屬性的hashCode和equals方法,也就是說用阿帕奇集合相減比較多個屬性的比較靈活多樣。帶來的問題也比較明顯,重寫hashCode和equals方法后,
在使用hashMap時要特別注意。
2.自己實現一個集合相減的方法。用hashMap實現 這種方法不需要重寫hashCode和equals方法,但是只能對一個屬性進行比較相減。
/**
* 依據集合元素的屬性,從list1中減去list2中存在的元素,
*
* @param list1
* @param list2
* @param argumentName
* @return
*/
public static <T> List<T> subtractList(List<T> list1, List<T> list2, String argumentName) {
List<T> result = new ArrayList<T>();
if (CollectionUtils.isEmpty(list1)) {
return result;
}
if (CollectionUtils.isEmpty(list2)) {
return list1;
}
Map<Object, T> map = initMap(list2, argumentName);
for (T t : list1) {
BeanWrapper beanWrapper = new BeanWrapperImpl(t);
Object value = beanWrapper.getPropertyValue(argumentName);
if (map.get(value) == null) {
result.add(t);
}
}
return result;
}
private static <T> Map<Object, T> initMap(List<T> list2, String argumentName) {
Map<Object, T> resultMap = new HashMap<Object, T>(list2.size());
for (T t : list2) {
BeanWrapper beanWrapper = new BeanWrapperImpl(t);
if (beanWrapper.getPropertyValue(argumentName) == null) {
throw new RuntimeException("argumentName is null");
}
resultMap.put(beanWrapper.getPropertyValue(argumentName), t);
}
return resultMap;
}
依據自己的業務需求,自行選擇。