在对数据进行批量操作的时候,由于数据量太大,需要对数据进行拆分操作,分成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