XiaoRuby
2023-08-22 f77a2eba10ce3f430d31a34790a8a1184c8069e6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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());
    }
 
 
}