jdk8 stream list分割 切割 分批次处理工具类

最近处理一个需求,需要将一批数据入库,处理的时候发现数据量超级大,于是就将批数据进行分割分批处理。

直接上码

样式超赞好看的原文链接:jdk8 stream list分割 切割 分批次处理工具类


package com.store.common.utils;

import java.util.*;

import java.util.stream.Collectors;

import java.util.stream.Stream;

public class CommonUtil {

    /**

    * 计算切分次数

    * @param size 需要分割的集合长度

    * @param maxNum 集合最大的数量

    * @param <T>

    * @return 切分次数

    */

    private static Integer countStep(Integer size, Integer maxNum) {

        return (size + maxNum - 1) / maxNum;

    }

    /**

    * 将一个集合进行分割

    * @param collections 需要分割的集合 (List LinkedHashSet TreeSet LinkedList)

    * @param maxNum 集合最大的数量

    * @param <T>

    * @return 分割后的集合

    */

    public static <T> Collection<Collection<T>> subCollection(Collection<T> collections, int maxNum){

        int limit = countStep(collections.size(), maxNum);

        //方法一:使用流遍历操作

//        Collection<Collection<T>> mglist = new ArrayList<>();

//        Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {

//            mglist.add(collections.stream().skip(i * maxNum).limit(maxNum).collect(Collectors.toList()));

//        });

//        return mglist;

        //方法二:获取分割后的集合

        Collection<Collection<T>> splitCollection = Stream.iterate(

                0, n -> n + 1).limit(limit).parallel().map(

                        a -> collections.stream().skip(a * maxNum).limit(maxNum).parallel()

                                .collect(Collectors.toList())).collect(Collectors.toList());

        return splitCollection;

    }

    public static void main(String[] args) {

        //test List

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

        //[[1, 2, 3], [4, 5, 6], [7]]

        System.out.println(subCollection(list, 3));

        //test set , allow LinkedHashSet TreeSet

        Set<Integer> set = new TreeSet() {

            {

                for (int i = 0; i < 40; i++) {

                    if (i % 2 == 0) {

                        add(i);

                    }

                }

            }

        };

        //[[0, 2, 4], [6, 8, 10], [12, 14, 16], [18, 20, 22], [24, 26, 28], [30, 32, 34], [36, 38]]

        System.out.println(subCollection(set, 3));

        //add()和remove()方法在失败的时候会抛出异常(不推荐)

        Queue<String> queue = new LinkedList<String>();

        //添加元素

        queue.offer("a");

        queue.offer("b");

        queue.offer("c");

        queue.offer("d");

        queue.offer("e");

        queue.offer("f");

        queue.offer("g");

        queue.offer("h");

        queue.offer("i");

        queue.offer("j");

        //[[a, b, c], [d, e, f], [g, h, i], [j]]

        System.out.println(subCollection(queue, 3));

    }

}

jdk8 stream list分割 切割 分批次处理工具类

————————————————

版权声明:本文为CSDN博主「努力奔跑的小蜗牛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/hjp2020/article/details/106852573

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容