美文网首页
ListKit 一个基于Stream API的工具类

ListKit 一个基于Stream API的工具类

作者: sliverTwo | 来源:发表于2021-08-21 19:17 被阅读0次

    Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。所以说,Java8中首次出现的 java.util.stream是一个函数式语言+多核时代综合影响的产物。

    距离java8发布已经过去很多年了,但是发现身边的人大部分对java8的Stream API的掌握程度还不是很高。同时,对一些我们常用的操作,使用Stream API实现还是有点繁琐,笔者当初也是花费了很多时间才将其掌握。比如根据指定key将list转换为map,或者抽取list中的某个属性。
    因此,笔者编写了ListKit这个工具类,帮助大家更好的享受Stream API + lambda带来的便利,提升代码的简洁度,让代码看起来更加舒服。源码和使用demo如下,请自取。

    ListKit

    package com.sliver.kit;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.LinkedHashMap;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    import java.util.Objects;
    import java.util.Optional;
    import java.util.Set;
    import java.util.function.BiConsumer;
    import java.util.function.BiFunction;
    import java.util.function.Function;
    import java.util.function.Predicate;
    import java.util.stream.Collectors;
    
    /**
     * Title: ListKit
     * Description: list工具类
     *
     * @author sliver
     * @date 2019年12月23日
     */
    public final class ListKit {
    
        public static final int MAX_POWER_OF_TWO = 1 << (Integer.SIZE - 2);
    
        private ListKit() {
            super();
        }
    
        /**
         * Title: distinct
         * Description: 过滤重复元素
         * 2020年6月24日
         *
         * @param <E>
         * @param list
         * @param keyFunction
         * @return
         */
        public static <E> List<E> distinct(List<E> list, Function<E, String> keyFunction) {
            Map<String, E> linkedMap = new LinkedHashMap<>();
            for (E item : list) {
                String key = keyFunction.apply(item);
                linkedMap.put(key, item);
            }
            return new ArrayList<>(linkedMap.values());
        }
    
        /**
         * Title:findFirst <br>
         * Description:获取第一个符合过滤条件的对象,不存在是返回空
         *
         * @param list      操作的list
         * @param predicate 用于判定的函数
         * @return E
         * @author sliver
         * @date 2021-08-18 20:37
         */
        public static <E> E findFirst(List<E> list, Predicate<E> predicate) {
            if (isEmpty(list)) {
                return null;
            }
            return list.stream().filter(predicate).findFirst().orElseGet(null);
        }
    
        /**
         * Title: findFirstRepeatElement
         * Description: 获取第一个满足过滤条件的重复元素(不包含null),若无重复数据则返回Optional.empty()
         * Date: 2020年4月14日
         *
         * @param <E>
         * @param list
         * @param operator
         * @return
         */
        public static <E> Optional<E> findFirstRepeatElement(List<E> list, Function<E, String> operator) {
            if (isEmpty(list)) {
                return Optional.empty();
            }
            HashSet<String> set = new HashSet<>(capacity(list.size()));
            for (E e : list) {
                String key = operator.apply(e);
                if (Objects.isNull(key)) {
                    continue;
                }
                if (set.contains(key)) {
                    return Optional.ofNullable(e);
                }
                set.add(key);
            }
            return Optional.empty();
        }
    
        private static <E> boolean isEmpty(List<E> list) {
            return Objects.isNull(list) || list.isEmpty();
        }
    
    
        /**
         * Title: existRepeatElement
         * Description: 判断是否存在重复的元素
         * Date: 2020年4月14日
         *
         * @param <E>
         * @param list
         * @param conditionFunction 判断条件
         * @return
         */
        public static <E> boolean existRepeatElement(List<E> list, Function<E, String> conditionFunction) {
            return findFirstRepeatElement(list, conditionFunction).isPresent();
        }
    
        /**
         * Title: filter
         * Description: 对List进行过滤,简化stream操作
         * Date: 2020年2月19日
         *
         * @param <E>
         * @param list
         * @param predicate 数据过滤函数
         * @return
         */
        public static <E> List<E> filter(List<E> list, Predicate<E> predicate) {
            if (isEmpty(list)) {
                return list;
            }
            return list.stream().filter(predicate).collect(Collectors.toList());
        }
    
    
        /**
         * Title:flat <br>
         * Description:list扁平化,过滤空元素
         *
         * @param list
         * @param flatFunction
         * @return java.util.List<E2>
         * @author sliver
         * @date 2021-08-18 20:52
         */
        public static <E1, E2> List<E2> flat(List<E1> list, Function<E1, List<E2>> flatFunction) {
            List<E2> resultList = new LinkedList<>();
            list.forEach(item -> {
                final List<E2> value = flatFunction.apply(item);
                if (Objects.isNull(value)) {
                    return;
                }
                resultList.addAll(value);
            });
            return resultList;
        }
    
    
        /**
         * Title: convert
         * Description: 转换list对象为指定类型,跳过null
         * 2020年2月4日
         *
         * @param <E1>
         * @param <E2>
         * @param list
         * @param convertFunction
         * @return
         */
        public static <E1, E2> List<E2> convert(List<E1> list, Function<E1, E2> convertFunction) {
            return getField(list, convertFunction);
        }
    
        /**
         * Title: getField
         * Description: 获取指定字段,跳过null
         * Date: 2020年4月29日
         *
         * @param <T>
         * @param <F>
         * @param list
         * @param operator
         * @return
         */
        public static <T, F> List<F> getField(List<T> list, Function<T, F> operator) {
            List<F> fields = new ArrayList<>(list.size());
            list.forEach(item -> {
                final F value = operator.apply(item);
                if (Objects.isNull(value)) {
                    return;
                }
                fields.add(value);
            });
            return fields;
        }
    
        /**
         * Title: getFieldSet
         * Description:获取指定字段集合,跳过null
         * Date: 2020年4月29日
         *
         * @param <T>
         * @param <F>
         * @param list
         * @param getFunction
         * @return
         */
        public static <T, F> Set<F> getFieldSet(List<T> list, Function<T, F> getFunction) {
            Set<F> fieldSet = new HashSet<>(capacity(list.size()));
            list.forEach(item -> {
                final F value = getFunction.apply(item);
                if (Objects.isNull(value)) {
                    return;
                }
                fieldSet.add(value);
            });
            return fieldSet;
        }
    
        /**
         * Title: getFieldStr
         * Description: 将list中的字段使用,连接成字符串,跳过null和空字符串
         * Date: 2020年3月3日
         *
         * @param <O>
         * @param list
         * @param getFunction
         * @return
         */
        public static <O> String getFieldStr(List<O> list, Function<O, String> getFunction) {
            return getFieldStr(list, getFunction, ",");
        }
    
        /**
         * Title:getFieldStr <br>
         * Description:将将list中的字段使用指定分隔符连接成字符串,跳过null和空字符串
         *
         * @param list
         * @param getFunction
         * @param split       分隔符
         * @return java.lang.String
         * @author sliver
         * @date 2021-08-18 21:06
         */
        public static <O> String getFieldStr(List<O> list, Function<O, String> getFunction, String split) {
            if (Objects.isNull(split)) {
                throw new IllegalArgumentException("split cannot be null");
            }
            if (isEmpty(list)) {
                return "";
            }
            StringBuilder sb = new StringBuilder();
            for (O item : list) {
                final String value = getFunction.apply(item);
                if (isBlank(value)) {
                    continue;
                }
                sb.append(value).append(split);
            }
            if (sb.length() == 0) {
                return "";
            }
            return sb.delete(sb.length() - 1, sb.length()).toString();
        }
    
        private static boolean isBlank(String value) {
            return Objects.isNull(value) || Objects.equals(value, "");
        }
    
        /**
         * Title: convertToMap
         * Description: 转换list为map,key值跳过空字符串和null
         * Date: 2020年4月29日
         *
         * @param <O>
         * @param list
         * @param keyFunction
         * @return
         */
        public static <O> Map<String, O> convertToMap(List<O> list, Function<O, String> keyFunction) {
            if (isEmpty(list)) {
                return new HashMap<>();
            }
            Map<String, O> resultMap = new HashMap<>(capacity(list.size()));
            list.forEach(item -> {
                final String key = keyFunction.apply(item);
                if (isBlank(key)) {
                    return;
                }
                resultMap.put(key, item);
            });
            return resultMap;
        }
    
    
        /**
         * Title: convertToMap
         * Description: 转换list为map,key值跳过空字符串和null
         * Date: 2020年4月29日
         *
         * @param list
         * @param keyFunction
         * @param valueFunction
         * @return
         */
        public static <K, V, E> Map<K, V> convertToMap(List<E> list, Function<E, K> keyFunction, Function<E, V> valueFunction) {
            if (isEmpty(list)) {
                return new HashMap<>();
            }
            Map<K, V> resultMap = new HashMap<>(capacity(list.size()));
            list.forEach(item -> resultMap.put(keyFunction.apply(item), valueFunction.apply(item)));
            return resultMap;
        }
    
        /**
         * Title: convertToMap
         * Description: 转换list为map,key值跳过空字符串和null
         * Date: 2020年4月29日
         *
         * @param list
         * @param keyFunction
         * @return
         * @see #convertToMap(List, Function, Function)
         */
        public static <E, K> Map<K, E> convert2Map(List<E> list, Function<E, K> keyFunction) {
            if (isEmpty(list)) {
                return new HashMap<>();
            }
            Map<K, E> resultMap = new HashMap<>(capacity(list.size()));
            list.forEach(item -> {
                final K key = keyFunction.apply(item);
                if (Objects.isNull(key)) {
                    return;
                }
                resultMap.put(key, item);
            });
            return resultMap;
        }
    
        /**
         * Title: mergeToMap
         * Description: 合并相同项
         * Date: 2020年2月19日
         *
         * @param <K>           键的类型
         * @param <E>           对象的类型
         * @param list          操作的集合
         * @param keyFunction   获取key的函数
         * @param mergeFunction 合并相同key项的行数, 参数 当前项,已存在的相同项(可能为空)
         * @reEurn
         * @see #merge(List, Function, BiFunction, Function)
         */
        public static <K, E> List<E> merge(List<E> list, Function<E, K> keyFunction, BiFunction<E, E, E> mergeFunction) {
            return merge(list,keyFunction,mergeFunction,e->e);
        }
    
    
        /**
         * Title:merge <br>
         * Description:根据指定规则对list中的项进行合并
         *
         * @param <K>             键的类型
         * @param <E>             对象的类型
         * @param list            操作的集合
         * @param keyFunction     获取key的函数
         * @param mergeFunction   合并相同key项的行数, 参数 当前项,已存在的相同项(可能为空)
         * @param initValFunction 对象初始化函数
         * @return java.util.List<R>
         * @author sliver
         * @date 2021-08-21 17:22
         */
        public static <K, E, R> List<R> merge(List<E> list, Function<E, K> keyFunction, BiFunction<E, R, R> mergeFunction, Function<E, R> initValFunction) {
            Map<K, R> map = mergeToMap(list, keyFunction, mergeFunction, initValFunction);
            return new ArrayList<>(map.values());
        }
    
    
        /**
         * Title: merge2Map
         * Description: 合并相同项转换为map
         * Date: 2020年5月29日
         *
         * @param <K>
         * @param <E>
         * @param <R>
         * @param list            数据源
         * @param keyFunction     提供key的函数
         * @param mergeFunction   做合并操作的函数
         * @param initValFunction 当key对应的value不存在时,用于初始化的函数,走这个function就不会走mergeFunction
         * @return
         */
        public static <K, E, R> Map<K, R> mergeToMap(List<E> list, Function<E, K> keyFunction, BiFunction<E, R, R> mergeFunction, Function<E, R> initValFunction) {
            Map<K, R> map = new HashMap<>(capacity(list.size()));
            list.forEach(item -> {
                K key = keyFunction.apply(item);
                R target = map.get(key);
                if (Objects.isNull(target)) {
                    target = initValFunction.apply(item);
                    map.put(key, target);
                } else {
                    map.put(key, mergeFunction.apply(item, target));
                }
            });
            return map;
        }
    
    
        /**
         * Title: groupToMap
         * Description: 根据指定规则将list聚合为Map,过滤空值
         * Date: 2020年3月18日
         *
         * @param <K>
         * @param <E>
         * @param list
         * @param keyFunction
         * @return
         */
        public static <K, E> Map<K, List<E>> groupToMap(List<E> list, Function<E, K> keyFunction) {
            return groupToMap(list, keyFunction, e -> e);
        }
    
        /**
         * Title: groupToMap
         * Description: 根据指定key函数和value函数将list聚合为Map,过滤空值
         * Date: 2020年3月18日
         *
         * @param <K>
         * @param <E>
         * @param list
         * @param keyFunction
         * @param valueFunction
         * @return
         */
        public static <K, E, R> Map<K, List<R>> groupToMap(List<E> list, Function<E, K> keyFunction, Function<E, R> valueFunction) {
            Map<K, List<R>> map = new HashMap<>(capacity(list.size()));
            list.forEach(item -> {
                K key = keyFunction.apply(item);
                List<R> target = map.get(key);
                if (Objects.isNull(target)) {
                    target = new ArrayList<>();
                    map.put(key, target);
                }
                target.add(valueFunction.apply(item));
            });
            return map;
        }
    
    
        /**
         * Title:setList <br>
         * Description:据关联字段进行1对多设置值,
         *
         * @param list1
         * @param key1Function
         * @param list2
         * @param key2Function
         * @param setConsumer
         * @return void
         * @author sliver
         * @date 2020-11-19 20:09
         */
        public static <E1, E2> void setList(List<E1> list1, Function<E1, String> key1Function, List<E2> list2, Function<E2, String> key2Function, BiConsumer<E1, List<E2>> setConsumer) {
            if (isEmpty(list1) || isEmpty(list2)) {
                return;
            }
            Map<String, List<E2>> list2Map = groupToMap(list2, key2Function);
            for (E1 e1 : list1) {
                String key = key1Function.apply(e1);
                List<E2> l2 = list2Map.get(key);
                if (!isEmpty(l2)) {
                    setConsumer.accept(e1, l2);
                }
            }
        }
    
        /**
         * Title:set <br>
         * Description:根据关联字段进行1对1或者一对多设置值。通常用于一对多或者一对一的表的连接
         *
         * @param list1
         * @param key1Function 获取list1中与list2的关联字段的函数
         * @param list2
         * @param key2Function 获取list2中与list1的关联字段的函数
         * @param setConsumer  设置值的函数
         * @return void
         * @author sliver
         * @date 2020-11-19 20:09
         */
        public static <E1, E2> void set(List<E1> list1, Function<E1, String> key1Function, List<E2> list2, Function<E2, String> key2Function, BiConsumer<E1, E2> setConsumer) {
            if (isEmpty(list1) || isEmpty(list2)) {
                return;
            }
            Map<String, E2> list2Map = convert2Map(list2, key2Function);
            for (E1 e1 : list1) {
                String key = key1Function.apply(e1);
                E2 e2 = list2Map.get(key);
                if (Objects.nonNull(e2)) {
                    setConsumer.accept(e1, e2);
                }
            }
        }
    
        /**
         * Returns a capacity that is sufficient to keep the map from being resized as
         * long as it grows no larger than expectedSize and the load factor is >= its
         * default (0.75).
         */
        static int capacity(int expectedSize) {
            if (expectedSize < MAX_POWER_OF_TWO) {
                return expectedSize + expectedSize / 3;
            }
            // any large value
            return Integer.MAX_VALUE;
        }
    
    }
    
    

    使用示例 ListKitDemo

    package com.sliver.kit;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Objects;
    import java.util.Optional;
    import java.util.Set;
    
    /**
     * <p>Title: ListKitDemo</p>
     * <p>Description: ListKit使用实例</p>
     * 我们使用学生对象和成绩表对象进行演示,它们的关系是一对多的关系,
     * 以下demo根据使用频次进行排序
     *
     * @author sliver
     * @email 18142611739@163.com
     * @date 2021-08-21 16:43
     */
    public class ListKitDemo {
        private static List<Student> studentList;
        private static List<Grade> gradeList;
    
        static void initData(){
            // 数据准备
            studentList = new ArrayList<>();
            studentList.add(new Student("001", "张三"));
            studentList.add(new Student("002", "李四"));
            studentList.add(new Student("003", "王五"));
            gradeList = new ArrayList<>();
            gradeList.add(new Grade("001", "数学", 88));
            gradeList.add(new Grade("001", "语文", 78));
            gradeList.add(new Grade("001", "英语", 90));
            gradeList.add(new Grade("002", "数学", 83));
            gradeList.add(new Grade("002", "语文", 73));
            gradeList.add(new Grade("002", "英语", 93));
            gradeList.add(new Grade("003", "数学", 85));
            gradeList.add(new Grade("003", "语文", 75));
            gradeList.add(new Grade("003", "英语", 95));
        }
    
        public static void main(String[] args) {
            System.out.println("=======testConvert=======");
            testConvert();
            System.out.println("\n=======testGroup=======");
            testGroup();
            System.out.println("\n=======testMerge=======");
            testMerge();
            System.out.println("\n=======testSet=======");
            testSet();
            System.out.println("\n=======testOther=======");
            testOther();
        }
    
        /**
         * Title:testConvert <br>
         * Description:演示convert、convertToMap的用法
         *
         * @return void
         * @date 2021-08-21 17:33
         */
        static void testConvert() {
            initData();
            // 使用ListKit.convert从students中获取学生姓名数组,也可以用ListKit.getField,与convert的实现一致,在此场景下更符合语义
            List<String> nameList = ListKit.convert(studentList, Student::getCode);
            System.out.println("ListKit.convert(studentList, Student::getCode):");
            System.out.println(nameList);
            // 从gradeList中获取有分数的学生编号
            Set<String> studentCodeSet = ListKit.getFieldSet(gradeList, Grade::getStudentCode);
            System.out.println("ListKit.getFieldSet(gradeList, Grade::getStudentCode):");
            System.out.println(studentCodeSet);
            // 将studentList转换为map,使用code作为key
            Map<String, Student> studentMap = ListKit.convert2Map(studentList, Student::getCode);
            System.out.println("ListKit.convert2Map(studentList, Student::getCode):");
            System.out.println(studentMap);
            // 将gradeList转换为map,使用studentCode+course作为key
            Map<String, Grade> gradeMap = ListKit.convert2Map(gradeList, e -> e.getStudentCode() + e.getCourse());
            System.out.println("ListKit.convert2Map(gradeList, e -> e.getStudentCode() + e.getCourse()):");
            System.out.println(gradeMap);
        }
    
        /**
         * Title:testGroup <br>
         * Description:测试分组相关方法
         *
         * @return void
         * @date 2021-08-21 17:42
         */
        static void testGroup() {
            initData();
            // 1. 将gradeList按studentCode分组
            Map<String, List<Grade>> gradeListMap = ListKit.groupToMap(gradeList, Grade::getStudentCode);
            System.out.println("ListKit.groupToMap(gradeList, Grade::getStudentCode):");
            System.out.println(gradeListMap);
            // 2. 将gradeList按studentCode分组,并且将value转换为score
            Map<String, List<Integer>> gradeListMap2 = ListKit.groupToMap(gradeList, Grade::getStudentCode, Grade::getScore);
            System.out.println("ListKit.groupToMap(gradeList, Grade::getStudentCode, Grade::getScore):");
            System.out.println(gradeListMap2);
        }
    
        /**
         * Title:testMerge <br>
         * Description:测试合并方法
         *
         * @return void
         * @date 2021-08-21 17:51
         */
        static void testMerge() {
            initData();
            // 1. 计算每个学生的总分
            List<Integer> gradeList = ListKit.merge(ListKitDemo.gradeList, Grade::getStudentCode, (item, target) -> target + item.getScore(), e -> e.getScore());
            System.out.println("ListKit.merge(gradeList, Grade::getStudentCode, (item, target) -> target+ item.getScore(), e -> e.getScore())");
            System.out.println(gradeList);
            Map<String, Integer> gradeMap = ListKit.mergeToMap(ListKitDemo.gradeList, Grade::getStudentCode, (item, target) -> target + item.getScore(), e -> e.getScore());
            System.out.println("ListKit.mergeToMap(ListKitDemo.gradeList, Grade::getStudentCode, (item, target) -> target + item.getScore(), e -> e.getScore())");
            System.out.println(gradeMap);
            // 2. 将gradeList按studentCode分组,并且将value转换为score
            Map<String, List<Integer>> gradeListMap2 = ListKit.groupToMap(ListKitDemo.gradeList, Grade::getStudentCode, Grade::getScore);
            System.out.println("ListKit.groupToMap(gradeList, Grade::getStudentCode, Grade::getScore):");
            System.out.println(gradeListMap2);
        }
    
    
    
        /**
         * Title:testSet <br>
         * Description:测试set方法,复合操作
         *
         * @return void
         * @date 2021-08-21 18:04
         */
        static void testSet() {
            initData();
            // 将gradeList放入studentList中
            ListKit.setList(studentList, Student::getCode, gradeList, Grade::getStudentCode, (student, gradeList) -> student.setScoreList(gradeList));
            System.out.println("ListKit.setList(studentList,Student::getCode,gradeList,Grade::getStudentCode,(student, gradeList)->student.setScoreList(gradeList))");
            System.out.println(studentList);
            // 设置总分数
            List<Grade> gradeList = ListKit.merge(ListKitDemo.gradeList, Grade::getStudentCode, (item, target) -> target.setScore(target.getScore() + item.getScore()));
            ListKit.set(studentList, Student::getCode, gradeList, Grade::getStudentCode, (student, grade) -> student.setTotalScore(grade.getScore()));
            System.out.println("ListKit.set(studentList, Student::getCode, gradeList, Grade::getStudentCode, (student, grade) -> student.setTotalScore(grade.getScore()))");
            System.out.println(studentList);
        }
    
        /**
         * Title:testOther <br>
         * Description:测试其它方法
         *
         * @return void
         * @date 2021-08-21 18:14
         */
        static void testOther() {
            initData();
            studentList.add(new Student("002", "李四"));
            // 1. 获取张三的信息
            Student student = ListKit.findFirst(studentList, e -> Objects.equals(e.getName(), "张三"));
            System.out.println("ListKit.findFirst(studentList, e -> Objects.equals(e.getName(), \"张三\"))");
            System.out.println(student);
            // 2. 获取重复信息
            // 判断是否存在重复信息
            boolean existRepeatElement = ListKit.existRepeatElement(studentList, Student::getCode);
            System.out.println("ListKit.existRepeatElement(studentList, Student::getCode)");
            System.out.println(existRepeatElement);
            Optional<Student> optional = ListKit.findFirstRepeatElement(studentList, Student::getCode);
            System.out.println("ListKit.findFirstRepeatElement(studentList,Student::getCode)");
            optional.ifPresent(e -> System.out.println(e));
            // 3. 排除重复信息
            List<Student> studentList2 = ListKit.distinct(studentList, Student::getCode);
            System.out.println("ListKit.distinct(studentList2, Student::getCode)");
            System.out.println(studentList2);
            // 4. 获取分数大于80的信息
            List<Grade> gradeList2 = ListKit.filter(ListKitDemo.gradeList, grade -> grade.getScore() > 80);
            System.out.println("ListKit.filter(ListKitDemo.gradeList, grade -> grade.getScore() > 80)");
            System.out.println(gradeList2);
            // 5. 将list中的list拉平
            ListKit.setList(studentList, Student::getCode, gradeList, Grade::getStudentCode, (stu, gradeList) -> stu.setScoreList(gradeList));
            List<Grade> gradeList1 = ListKit.flat(studentList, Student::getScoreList);
            System.out.println(" ListKit.flat(studentList, Student::getScoreList)");
            System.out.println(gradeList1);
        }
    }
    
    class Student {
        /**
         * 学号
         */
        private String code;
    
        /**
         * 姓名
         */
        private String name;
        private Integer totalScore;
    
        private List<Grade> scoreList;
    
        public Student(String code, String name) {
            this.code = code;
            this.name = name;
        }
    
        public Integer getTotalScore() {
            return totalScore;
        }
    
        public Student setTotalScore(Integer totalScore) {
            this.totalScore = totalScore;
            return this;
        }
    
        public String getCode() {
            return code;
        }
    
        public Student setCode(String code) {
            this.code = code;
            return this;
        }
    
        public String getName() {
            return name;
        }
    
        public Student setName(String name) {
            this.name = name;
            return this;
        }
    
        public List<Grade> getScoreList() {
            return scoreList;
        }
    
        public Student setScoreList(List<Grade> scoreList) {
            this.scoreList = scoreList;
            return this;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "code='" + code + '\'' +
                    ", name='" + name + '\'' +
                    ", scoreList=" + scoreList +
                    '}';
        }
    }
    
    class Grade {
        /**
         * 学生编号
         */
        private String studentCode;
        /**
         * 课程
         */
        private String course;
        /**
         * 分数
         */
        private Integer score;
    
        public Grade(String studentCode, String course, Integer score) {
            this.studentCode = studentCode;
            this.course = course;
            this.score = score;
        }
    
        public String getStudentCode() {
            return studentCode;
        }
    
        public Grade setStudentCode(String studentCode) {
            this.studentCode = studentCode;
            return this;
        }
    
        public String getCourse() {
            return course;
        }
    
        public Grade setCourse(String course) {
            this.course = course;
            return this;
        }
    
        public Integer getScore() {
            return score;
        }
    
        public Grade setScore(Integer score) {
            this.score = score;
            return this;
        }
    
        @Override
        public String toString() {
            return "Grade{" +
                    "studentCode='" + studentCode + '\'' +
                    ", course='" + course + '\'' +
                    ", score='" + score + '\'' +
                    '}';
        }
    }
    

    demo方法运行结果

    =======testConvert=======
    ListKit.convert(studentList, Student::getCode):
    [001, 002, 003]
    ListKit.getFieldSet(gradeList, Grade::getStudentCode):
    [001, 002, 003]
    ListKit.convert2Map(studentList, Student::getCode):
    {001=Student{code='001', name='张三', scoreList=null}, 002=Student{code='002', name='李四', scoreList=null}, 003=Student{code='003', name='王五', scoreList=null}}
    ListKit.convert2Map(gradeList, e -> e.getStudentCode() + e.getCourse()):
    {001数学=Grade{studentCode='001', course='数学', score='88'}, 002语文=Grade{studentCode='002', course='语文', score='73'}, 003语文=Grade{studentCode='003', course='语文', score='75'}, 003英语=Grade{studentCode='003', course='英语', score='95'}, 002英语=Grade{studentCode='002', course='英语', score='93'}, 001英语=Grade{studentCode='001', course='英语', score='90'}, 001语文=Grade{studentCode='001', course='语文', score='78'}, 003数学=Grade{studentCode='003', course='数学', score='85'}, 002数学=Grade{studentCode='002', course='数学', score='83'}}
    
    =======testGroup=======
    ListKit.groupToMap(gradeList, Grade::getStudentCode):
    {001=[Grade{studentCode='001', course='数学', score='88'}, Grade{studentCode='001', course='语文', score='78'}, Grade{studentCode='001', course='英语', score='90'}], 002=[Grade{studentCode='002', course='数学', score='83'}, Grade{studentCode='002', course='语文', score='73'}, Grade{studentCode='002', course='英语', score='93'}], 003=[Grade{studentCode='003', course='数学', score='85'}, Grade{studentCode='003', course='语文', score='75'}, Grade{studentCode='003', course='英语', score='95'}]}
    ListKit.groupToMap(gradeList, Grade::getStudentCode, Grade::getScore):
    {001=[88, 78, 90], 002=[83, 73, 93], 003=[85, 75, 95]}
    
    =======testMerge=======
    ListKit.merge(gradeList, Grade::getStudentCode, (item, target) -> target+ item.getScore(), e -> e.getScore())
    [256, 249, 255]
    ListKit.mergeToMap(ListKitDemo.gradeList, Grade::getStudentCode, (item, target) -> target + item.getScore(), e -> e.getScore())
    {001=256, 002=249, 003=255}
    ListKit.groupToMap(gradeList, Grade::getStudentCode, Grade::getScore):
    {001=[88, 78, 90], 002=[83, 73, 93], 003=[85, 75, 95]}
    
    =======testSet=======
    ListKit.setList(studentList,Student::getCode,gradeList,Grade::getStudentCode,(student, gradeList)->student.setScoreList(gradeList))
    [Student{code='001', name='张三', scoreList=[Grade{studentCode='001', course='数学', score='88'}, Grade{studentCode='001', course='语文', score='78'}, Grade{studentCode='001', course='英语', score='90'}]}, Student{code='002', name='李四', scoreList=[Grade{studentCode='002', course='数学', score='83'}, Grade{studentCode='002', course='语文', score='73'}, Grade{studentCode='002', course='英语', score='93'}]}, Student{code='003', name='王五', scoreList=[Grade{studentCode='003', course='数学', score='85'}, Grade{studentCode='003', course='语文', score='75'}, Grade{studentCode='003', course='英语', score='95'}]}]
    ListKit.set(studentList, Student::getCode, gradeList, Grade::getStudentCode, (student, grade) -> student.setTotalScore(grade.getScore()))
    [Student{code='001', name='张三', scoreList=[Grade{studentCode='001', course='数学', score='256'}, Grade{studentCode='001', course='语文', score='78'}, Grade{studentCode='001', course='英语', score='90'}]}, Student{code='002', name='李四', scoreList=[Grade{studentCode='002', course='数学', score='249'}, Grade{studentCode='002', course='语文', score='73'}, Grade{studentCode='002', course='英语', score='93'}]}, Student{code='003', name='王五', scoreList=[Grade{studentCode='003', course='数学', score='255'}, Grade{studentCode='003', course='语文', score='75'}, Grade{studentCode='003', course='英语', score='95'}]}]
    
    =======testOther=======
    ListKit.findFirst(studentList, e -> Objects.equals(e.getName(), "张三"))
    Student{code='001', name='张三', scoreList=null}
    ListKit.existRepeatElement(studentList, Student::getCode)
    true
    ListKit.findFirstRepeatElement(studentList,Student::getCode)
    Student{code='002', name='李四', scoreList=null}
    ListKit.distinct(studentList2, Student::getCode)
    [Student{code='001', name='张三', scoreList=null}, Student{code='002', name='李四', scoreList=null}, Student{code='003', name='王五', scoreList=null}]
    ListKit.filter(ListKitDemo.gradeList, grade -> grade.getScore() > 80)
    [Grade{studentCode='001', course='数学', score='88'}, Grade{studentCode='001', course='英语', score='90'}, Grade{studentCode='002', course='数学', score='83'}, Grade{studentCode='002', course='英语', score='93'}, Grade{studentCode='003', course='数学', score='85'}, Grade{studentCode='003', course='英语', score='95'}]
    ListKit.setList(studentList, Student::getCode, gradeList, Grade::getStudentCode, (student, gradeList) -> student.setScoreList(gradeList))
    [Grade{studentCode='001', course='数学', score='88'}, Grade{studentCode='001', course='语文', score='78'}, Grade{studentCode='001', course='英语', score='90'}, Grade{studentCode='002', course='数学', score='83'}, Grade{studentCode='002', course='语文', score='73'}, Grade{studentCode='002', course='英语', score='93'}, Grade{studentCode='003', course='数学', score='85'}, Grade{studentCode='003', course='语文', score='75'}, Grade{studentCode='003', course='英语', score='95'}, Grade{studentCode='002', course='数学', score='83'}, Grade{studentCode='002', course='语文', score='73'}, Grade{studentCode='002', course='英语', score='93'}]
    

    相关文章

      网友评论

          本文标题:ListKit 一个基于Stream API的工具类

          本文链接:https://www.haomeiwen.com/subject/kwfqiltx.html