代码如下:
/**
* 将一个 list 集合, 分割成指定大小的"块"
* <p>
* 主要用于大数据量的入库
* 注: 此方法进行分割的 list 为只读状态, 不能进行其他操作
*
* @param list 原始 list 列表
* @param batchSize 指定每一"块"的数量
* @return
*/
public static <T> List<List<T>> subList(List<T> list, int batchSize) {
//总数
int len = list.size();
if (batchSize == 0) {
batchSize = 1;
}
//轮数
int times = len / batchSize;
//如果不能整除,则要多跑一轮
if (len % batchSize != 0) {
times++;
}
log.info("总共 {} 条记录, 分割为 {} 块", len, times);
List<List<T>> resList = new ArrayList<>(times);
int start = 1;
int end = 1;
for (int i = 1; i <= times; i++) {
start = (i - 1) * batchSize;
end = start + batchSize;
//最后一轮数据未满
if (end >= len) {
end = len;
}
//子集为开区间[0,len) =[0, len-1]
List<T> subNewList = list.subList(start, end);
resList.add(subNewList);
}
return resList;
}