在对数据进行批量操作的时候,由于数据量太大,需要对数据进行拆分操作,分成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 {/*** 拆分集合* <p>* 拆分方式有多种,示例代码如下;** <pre>* List<T> 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);* }* </pre>** @param <T> 泛型对象* @param list 需要拆分的集合* @param subListLength 每个子集合的元素个数* @return 返回拆分后的各个集合组成的列表**/public static <T> List<List<T>> split(List<T> list, int subListLength) {List<List<T>> 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 <T> List<T> getList(List<T> 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<String> list = IntStream.range(0, size).mapToObj(index -> "hello:" + index).collect(Collectors.toList());// 大集合里面包含多个小集合long beginTime = System.nanoTime();List<List<String>> temps = split(list, 100);System.out.println("耗时:" + (System.nanoTime() - beginTime));int j = 0;// 对大集合里面的每一个小集合进行操作for (List<String> obj : temps) {System.out.println(StrUtil.format("row:{}, size:{}", ++j, obj.size()));}}
}
执行平均时间:≈15ms