Iterator 是 Stream API 的思想前身和底层基础,体现按需取值、单向推进、解耦遍历与数据结构三大范式,JDK 中 Stream 实际基于 Spliterator(Iterator 的并行增强版)构建。

Java 中的 Iterator 本身不是流式处理(Stream API)的实现,但它确实是流式数据处理的思想前身和底层基础。它通过“按需取值”“单向推进”“解耦遍历逻辑与数据结构”这三点,为 Java 8 的 Stream 奠定了关键设计范式。
Iterator 是流式处理的雏形
流式处理强调“不一次性加载全部数据、只在需要时计算”,而 Iterator 天然支持这种惰性(lazy)行为:
- next() 是一次只取一个:不预加载整个集合,内存开销恒定,适合大数据量或无限/延迟生成的数据源(如日志行、网络响应流);
- hasNext() 控制流程边界:遍历由“是否有下一个”驱动,而非索引或长度,天然适配未知大小的数据源;
-
remove() 提供安全的中间操作语义:虽功能简单,但已体现“遍历中修改”的意图——这正是
Stream.filter()、map()等中间操作的原始映射。
从 Iterator 到 Stream 的演进逻辑
Stream API 可看作 Iterator 的函数式升级,核心延续点包括:
-
统一入口:就像所有
Collection都提供iterator()方法,所有集合也都能调用stream(); -
链式调用:Iterator 需手动 while 循环 + next(),而 Stream 把 hasNext/next 封装进
filter、map等方法内部,自动串联执行; -
延迟执行:Iterator 的遍历是逐步触发的,Stream 的中间操作(如
sorted())也不立即执行,直到遇到终端操作(如collect()或forEach()),本质仍是“按需拉取”; - 不可重用性一致:Iterator 遍历完即失效,Stream 也是一次性消费,不能复用,避免状态歧义。
手写类 Stream 的 Iterator 实现(简易示意)
你可以用 Iterator 模拟最简 Stream 行为,比如实现一个带过滤的迭代器:
private final Iterator
private final Predicate
private T nextItem;
public FilteringIterator(Iterator
this.source = source;
this.predicate = predicate;
findNext();
}
private void findNext() {
nextItem = null;
while (source.hasNext()) {
T item = source.next();
if (predicate.test(item)) {
nextItem = item;
break;
}
}
}
@Override
public boolean hasNext() { return nextItem != null; }
@Override
public T next() {
T item = nextItem;
if (item == null) throw new NoSuchElementException();
findNext();
return item;
}
}
这个类就实现了类似 stream.filter(...).iterator() 的能力——它不改变原集合,不预加载,只在调用 next() 时动态筛选下一个匹配项。
为什么说它是“前身”而不是“替代”
Iterator 更底层、更轻量,适合资源受限场景或自定义数据源(如文件逐行读取、数据库游标分页);Stream 更高层、更声明式,适合组合复杂逻辑。JDK 内部很多 Stream 操作(如 StreamSupport.stream(spliterator, false))最终仍基于 Spliterator(Iterator 的并行增强版)构建。可以说:Iterator 定义了“怎么一步步走”,Stream 定义了“走哪条路、怎么变换风景”——前者是后者的行走机制,后者是前者的表达升级。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











