实现比较两个List之间的差异,包括获取两List的差集,交集,并集(不去重&去重)。
求差集
/**
*
* 差集(基于API解法) 适用于小数据量
* 求sourceList中有但targetList中没有的元素
* 时间复杂度 O(sourceList.size() * targetList.size())
* typeConverter方法用于提取list中存储的对象的某个字段元素,并去重,而后将形成一个新的List集合
*/
public static <S,T,R> List<R> subList(List<S> sourceList, Function<S, R> sourceMapper,List<T> targetList,Function<T,R> targetMapper) {
List<R> resultList = new ArrayList<>(typeConverter(sourceList, sourceMapper));
resultList.removeAll(typeConverter(targetList,targetMapper));
return resultList;
}
public static <T, R> List<R> typeConverter(List<T> list, Function<T, R> mapper) {
return list.stream().map(mapper).distinct().collect(Collectors.toList());
}
/**
* 差集(基于java8新特性) 适用于大数据量
* 求sourceList中有但targetList中没有的元素
*/
public static <R> List<R> subList(List<R> sourceList,List<R> targetList){
List<R> resultList = sourceList.stream().filter(e -> !targetList.contains(e)).collect(Collectors.toList());
return resultList;
}
求交集
/**
* 交集(基于API解法) 适用于小数据量
* 求sourceList和targetList中都有的元素
* 时间复杂度 O(sourceList.size() * targetList.size())
*/
public static <R> List<R> intersectList(List<R> sourceList, List<R> targetList){
List<R> resultList = new ArrayList<>(sourceList);
resultList.retainAll(targetList);
return resultList;
}
/**
* 交集(基于java8新特性) 适用于大数据量
* 求sourceList和targetList中都有的元素
*/
public static <R> List<R> intersectList(List<R> sourceList,List<R> targetList){
List<R> resultList = sourceList.stream().filter(targetList::contains).collect(Collectors.toList());
return resultList;
}
求并集(不去重)
/**
* 并集(不去重)
* 合并sourceList和targetList不考虑去除重复元素
*
*/
public static <R> List<R> mergeList(List<R> sourceList,List<R> targetList){
targetList.addAll(sourceList);
return targetList;
}
求并集(去重)
/**
* 并集(去重)
* 合并sourceList和targetList并且去除重复元素
*
*/
public static <R> List<R> mergeList(List<R> sourceList,List<R> targetList){
// 使用 HashSet 存储所有元素,自动去重
Set<R> target = new HashSet<>(targetList);
target.addAll(sourceList);
List<R> resultList = new ArrayList<>(target);
return resultList;
}