使用场景:需要把一个大 List 拆分出很多小 List ,然后再对每一部分进行分批处理,这里整个工具,因为每次都来写一个拆分不令阅读困难,也难维护,更容易出错。
/** * 创建人 : sanri * 创建时间 : 2018/9/1-15:12 * 功能 : list 拆分 */ public class ListSplitIterator<T> implements Iterator<List<T>> { protected List<T> originData; private int position; //默认每页 1000 条 private int pageSize = 1000; public ListSplitIterator(List<T> originData){ if(originData == null){return ;} this.originData = originData; position = 0; //初始化位置为 0 } public ListSplitIterator(List<T> originData, int pageSize) { this(originData); if(pageSize <= 0){ throw new IllegalArgumentException("pageSize 需要输入一个大于 0 的值"); } this.pageSize = pageSize; } @Override public boolean hasNext() { return originData != null && !originData.isEmpty() && position < originData.size(); } @Override public List<T> next() { if(hasNext()){ int start = position; int end = position + pageSize ; if(end >= originData.size()){ end = originData.size(); } List<T> current = originData.subList(start,end); position = end ; return current; } return null; } @Override public void remove() { throw new RuntimeException("未实现 remove 方法"); } public int size(){ return originData == null ? 0 : ( originData.size() - 1) / pageSize + 1; } public List<T> get(int index){ if(originData == null) return null; int start = index * pageSize; int end = (index + 1 ) * pageSize; if (end >= originData.size()){ end = originData.size(); } return originData.subList(start,end); } /** * 获取当前位置 * @return */ public long position() { return position; } }
// 获取数据 List<Batch> batches = new ArrayList(); // 每批数据的大小 int batchCount = 500; // 构建分割 ListSplitIterator<Batch> batchListSplitIterator = new ListSplitIterator<>(batches, batchCount); // 迭代每一批数据 while (batchListSplitIterator.hasNext()){ List<Batch> batchSubList = batchListSplitIterator.next(); }
创作不易,希望可以推广下我的小工具,很实用的解决项目中的一些麻烦的事情,欢迎来 gitee 点星,fork
gitee 地址: https://gitee.com/sanri/sanri-tools-maven
博客地址: https://blog.csdn.net/sanri1993/article/details/98664034