Java拆分集合

在对数据进行批量操作的时候,由于数据量太大,需要对数据进行拆分操作,分成N个小集合。

代码如下:

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * 拆分集合
 *
 * @author HY
 * @date 2023/11/21
 */
public class SplitListUtils {

    /**
     * 拆分集合
     * 

* 拆分方式有多种,示例代码如下; * *

     * List subItemList = null;
     * // 根据批次数遍历数据
     * for (int i = 0; i < batchCount; i++) {
     *     // 方式一:
     *     //if (i == batchCount - 1) {
     *     //    itemList = list.subList(subListLength * i, dataSize);
     *     //} else {
     *     //    itemList = list.subList(subListLength * i, subListLength * (i + 1));
     *     //}
     *     //newList.add(itemList);
     *
     *     // 方式二:
     *     int start = i * subListLength;
     *     int end = Math.min(start + subListLength, dataSize);
     *
     *     subItemList = list.subList(start, end);
     *
     *     newList.add(subItemList);
     * }
     * 
* * @param 泛型对象 * @param list 需要拆分的集合 * @param subListLength 每个子集合的元素个数 * @return 返回拆分后的各个集合组成的列表 **/ public static List> split(List list, int subListLength) { List> newList = new ArrayList<>(); if (CollUtil.isEmpty(list) || subListLength <= 0) { return newList; } int dataSize = list.size(); if (dataSize <= subListLength) { // 数据量不足 subListLength 指定的大小 newList.add(list); return newList; } // 批次处理数(结果向上取整) int batchSize = (int) Math.ceil(1.0 * dataSize / subListLength); return IntStream.range(0, batchSize) .mapToObj(index -> getList(list, subListLength, dataSize, index)) .collect(Collectors.toList()); } private static List getList(List list, int subListLength, int dataSize, int index) { int start = index * subListLength; int end = Math.min((index + 1) * subListLength, dataSize); return list.subList(start, end); } public static void main(String[] args) { int size = 10000009; List list = IntStream.range(0, size).mapToObj(index -> "hello:" + index).collect(Collectors.toList()); // 大集合里面包含多个小集合 long beginTime = System.nanoTime(); List> temps = split(list, 100); System.out.println("耗时:" + (System.nanoTime() - beginTime)); int j = 0; // 对大集合里面的每一个小集合进行操作 for (List obj : temps) { System.out.println(StrUtil.format("row:{}, size:{}", ++j, obj.size())); } } }

执行平均时间:≈15ms

你可能感兴趣的:(Java,集合,list)