package com.yuanchu.limslaboratory.utils; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @Author 张宾 */ public class ArrayListUtil { /** * 单值集合去重 * @param objList * @param * @return */ public static List singleValueDistinct(ListobjList){ return objList.stream().distinct().collect(Collectors.toList()); } /** * 单值集合比较 主集合中与次集合不相等数据 * @param mainList 主集合 * @param secondaryList 次要集合 * @param * @return 主集合中跟次要集合不相等的数据 */ public static List compareNotEqualListBySingleValue(ListmainList,ListsecondaryList){ return mainList.stream().filter(item -> !secondaryList.stream() .map(e -> e).distinct().collect(Collectors.toList()) .contains(item)) .collect(Collectors.toList()); } /** * 单值集合比较 主集合中与次集合相等数据 * @param mainList 主集合 * @param secondaryList 次要集合 * @param * @return 主集合中跟次要集合不相等的数据 */ public static List compareEqualListBySingleValue(ListmainList,ListsecondaryList){ return mainList.stream().filter(item -> secondaryList.stream() .map(e -> e).collect(Collectors.toList()) .contains(item)) .collect(Collectors.toList()); } /** * 单值集合合并 * @param isDistinct * @param values * @param * @return */ @SafeVarargs public static List mergeListBySingleValue(boolean isDistinct, List... values){ //去重合并 if (isDistinct){ return Stream.of(values).flatMap(Collection::stream).distinct().collect(Collectors.toList()); } return Stream.of(values).flatMap(Collection::stream).collect(Collectors.toList()); } /** * 单个对象集合根据对象属性去重集合 * @param keyExtractor * @param objects * @param * @return */ public static List oneObjectsDistinctByProperty(Function keyExtractor,List objects){ List newList = new ArrayList<>(); objects.stream().filter(distinctByKey(keyExtractor)) //filter保留true的值 .forEach(newList::add); return newList; } /** * 多对象集合合并根据属性去重 * @param objects * @param * @return */ @SafeVarargs public static List mergeListByObjectsDistinct(Function keyExtractor,List... objects){ List tList = mergeListByObjects(objects); return oneObjectsDistinctByProperty(keyExtractor,tList); } /** * 多对象集合合并无需去重 重载 * @param objects * @param * @return */ @SafeVarargs public static List mergeListByObjectsDistinct(List... objects){ return mergeListByObjects(objects); } private static Predicate distinctByKey(Function keyExtractor) { Map seen = new ConcurrentHashMap<>(); //putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。 //如果返回null表示添加数据成功(不重复),不重复(null==null :TRUE) return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; } /** * 对象集合合并 * @param objects * @param * @return */ @SafeVarargs private static List mergeListByObjects(List... objects){ return Stream.of(objects).flatMap(Collection::stream).collect(Collectors.toList()); } }