开篇先卖个关子,你们代码里面用的最多的代码工具是啥?
我先来,直接上代码
我翻了翻代码,发现竟然是下面这个工具方法,集合拆分工具类
/**
* 支持 import Java 标准库 (JDK 1.8)
*/
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 注意:目前 Java 代码的入口类名称必须为 Main(大小写敏感)
*/
public class Main {
public static void main(String []args) {
List<String> userIds = new ArrayList<>();
for(int i =0;i<10000;i++){
userIds.add(UUID.randomUUID().toString());
}
List<List<String>> listByLimit = getListByLimit(userIds, 1000);
// TODO 循环遍历每个集合处理数据
}
/**
* 通过传入的LIST,拆分成已limitSize数量的多个集合
*
* @param list
* @param limitSize
* @param <T>
* @return
*/
public static <T> List<List<T>> getListByLimit(Collection<T> list, int limitSize) {
int limit = countStep(list.size(), limitSize);
List<List<T>> mgList = new ArrayList<>();
Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
mgList.add(list.stream().skip(i * limitSize).limit(limitSize).collect(Collectors.toList()));
});
return mgList;
}
/**
* 计算需要分为几个集合
*
* @param totalSize
* @param limitSize
* @return
*/
private static Integer countStep(Integer totalSize, Integer limitSize) {
return (totalSize + limitSize - 1) / limitSize;
}
}
为什么使用了这么多,都有哪些场景?
场景1 分批次查询sql
- 为什么要用在项目代码中相信大家都知道避免不了IN多个数据的情况,那么直接IN不行么?
- 导致的结果数据量少时还好,如果有1W以上数据需要IN呢,此时如果直接IN,那么表数据量大时会出现索引失效的情况,效率极低。
- 分批处理建议一般情况下1K调用一次最为合理。
场景2 分批次调用接口
- 为什么要用当数据量过大时调用接口(不论是第三方还是公司自己的接口),不分批调用对方都要骂娘了。
- 导致的结果轻则对方屏蔽你的接口,重则对方接口直接被干挂掉
- 分批处理建议根据业务场景不同,接口复杂度高的建议200一次调用,如果复杂度低的可以控制1000调用一次(为啥是1000,原理参考sql分批查询逻辑)
总结
- 以上方法可以理解为是内存分页,方法不限于此,有更好的方法可以一起讨论。
- 以上方法都是在内存中处理,如果数据量太大时慎用(达到百万千万,还是考虑数据库分页保险)。