List集合分片处理
使用场景
当集合过大,单次处理数据对数据库造成压力时,必须考虑分批分片处理数据。比如 Oracle数据库中IN参数个数不能超过1000 ,这时可以把参数进行分批处理。当然这种情况也可 用表关联代替IN:.在where条件中使用子查询,如“select * from b where c in (select d from e …)” 或者 可以拆分sql用 where id in (1, 2, …, 999) or id in (1000, …)这种方法解决 。本文则侧重讲解如何分片集合。
代码分析
public class SubList {
public static void main(String[] args) {
String [] str = {"a1","b2","c3","d4","e5","f6","g7","h8","i9","j10","k11","L12","m13"};
List<String> list = Arrays.asList(str);
List<List<String>> splitList = splitList(list, 6);
splitList.stream().forEach(System.out::println);
}
/**
* 指定大小,分割集合,将集合按照规定个数分为n个部分
*/
public static <T> List<List<T>> splitList(List<T> list, int length){
if (list.isEmpty() || list == null || length < 1) {
return Collections.emptyList();
}
//result 最终分片后结果
List<List<T>> result = new ArrayList<List<T>>();
int size = list.size();
System.out.println("分片前list大小: " + size);
//count分片大小
int count = (size + length -1) / length;
System.out.println("每片大小为 " + length + ";共分为 " + count +" 片");
for (int i = 0; i < count; i++) {
List<T> subList = list.subList(i*length, (i+1)*length > size ? size : (i+1)*length);
result.add(subList);
}
return result;
}
}
输出结果:
分片前list大小: 13
每片大小为 6;共分为 3 片
[a1, b2, c3, d4, e5, f6]
[g7, h8, i9, j10, k11, L12]
[m13]