Iterator本身不支持分页分批,但可通过计数器控制遍历节奏实现逻辑分批;可封装BatchIterator工具类复用逻辑;对随机访问集合可用Stream.skip/limit模拟分页;数据库场景则结合ResultSet流式分批读取。

Java 中 Iterator 本身不支持分页或分批,它只是单向遍历容器的接口,没有跳转、重置或批量切片能力。但你可以用它配合其他手段实现“逻辑上的分页分批处理”,关键在于**控制遍历节奏、手动计数、按需消费元素**。
用 Iterator + 计数器实现简单分批
适用于已知总数据量(如 List)、需要每 N 条处理一次的场景。核心是:遍历过程中自己维护索引和批次边界。
- 创建普通 Iterator(如
list.iterator()) - 用
int count = 0和int batchSize = 100控制批次 - 每次
next()后递增 count;当count % batchSize == 0或到达末尾时,触发一批处理逻辑
示例:
List<string> data = Arrays.asList("a", "b", "c", "d", "e", "f");
Iterator<string> it = data.iterator();
int batchSize = 2;
List<string> batch = new ArrayList();
int count = 0;
<p>while (it.hasNext()) {
batch.add(it.next());
count++;
if (count % batchSize == 0 || !it.hasNext()) {
System.out.println("处理批次: " + batch);
batch.clear();
}
}</p></string></string></string>封装成可复用的 BatchIterator 工具类
避免每次手写计数逻辑,可封装一个包装类,让外部按“批”获取数据。
- 构造时传入原始 Iterator 和 batchSize
- 提供
hasNextBatch()和nextBatch()方法 - 内部用 while 循环填充当前批次,自动跳过已消费元素
注意:该类不是线程安全,且只支持单次顺序消费。
结合 Stream + skip/limit(仅限支持随机访问的集合)
如果底层是 List 等支持随机访问的结构,更推荐用 Stream 模拟分页:
list.stream().skip((page - 1) * size).limit(size).forEach(...)- 这种方式本质是重新生成流,不依赖 Iterator 状态,适合“跳页”场景
- 但对大集合效率低(skip 是 O(n)),不适合高频分页遍历
数据库场景:用 JDBC ResultSet + Iterator 思路分批读取
真正的大数据分页分批,常见于从数据库流式读取(如百万级导出)。此时可:
- 用
Statement.setFetchSize(n)提示 JDBC 驱动分批拉取 - 将
ResultSet封装为自定义 Iterator,每次next()调用rs.next() - 在迭代中累积到 batchSize 后统一处理,再清空缓存
- 避免一次性把全部结果加载进内存
这是 Iterator 分批思想最典型的落地场景——**流式、低内存、不可回溯**。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











