兩種方法:
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; }
依據自己的業務需求,自行選擇。