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