java中可通过实现iterator接口构建compositeiterator,维护迭代器列表与当前活跃迭代器,调用hasnext()时动态定位有效迭代器,next()委托执行并自动切换,支持remove()操作且需状态校验。

Java 中可以通过实现 Iterator 接口,把多个迭代器“串”起来,形成一个统一的组合迭代器(Composite Iterator),对外只暴露一个迭代入口,内部按顺序遍历多个数据源。核心思路是:维护一个迭代器列表,当前正在使用的迭代器,以及切换逻辑。
定义组合迭代器类并管理子迭代器
创建一个类(如 CompositeIterator<t></t>)实现 Iterator<t></t>,内部持有一个 List<iterator>></iterator>,以及当前活跃的索引(currentIdx)和当前迭代器(currentIt)。初始化时将所有待组合的迭代器加入列表,并立即尝试定位到第一个有效迭代器。
示例关键逻辑:
- 构造时接收
Collection extends Iterator<t>></t>或可变参数Iterator<t>...</t> - 调用
findNextValidIterator()初始化currentIt:从头开始遍历列表,跳过已耗尽的迭代器,找到第一个hasNext() == true的 - 若全部耗尽,则
currentIt为null,后续hasNext()返回false
正确实现 hasNext() 和 next()
hasNext() 不应仅检查当前迭代器——因为当前迭代器可能刚返回最后一个元素,但下一个迭代器还有数据。稳妥做法是:在每次调用 hasNext() 时,先确保 currentIt 指向一个有效的、非空的迭代器(即执行一次 findNextValidIterator()),再返回 currentIt != null && currentIt.hasNext()。
next() 则直接委托给 currentIt.next();但必须在取值后再次调用 findNextValidIterator()(或延迟到下次 hasNext()),以便在当前迭代器耗尽后自动切换。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注意:不能在 next() 里提前切换,否则会跳过当前迭代器的最后一个元素;也不能在 hasNext() 里无条件切换,否则多次调用 hasNext() 可能错误推进状态。
支持移除操作(可选)
如果需要支持 remove(),必须确保它作用于当前正在提供元素的那个迭代器。由于 Iterator.remove() 是“最近一次 next() 返回的元素”,只要 next() 始终委托给 currentIt,那么 currentIt.remove() 就是合法且安全的。但需加判空和状态检查(例如是否已调用 next() 且未被移除过)。
典型处理:
- 记录上一次
next()是否成功(设标志位canRemove) -
remove()中校验canRemove,调用currentIt.remove(),然后重置标志位 -
next()成功后置canRemove = true,hasNext()不影响该标志
使用示例与注意事项
你可以轻松组合 ArrayList.iterator()、HashSet.iterator()、甚至另一个 CompositeIterator:
Iterator<string> it1 = Arrays.asList("a", "b").iterator();
Iterator<string> it2 = Arrays.asList("c", "d", "e").iterator();
Iterator<string> it3 = Collections.emptyIterator();
Iterator<string> composite = new CompositeIterator(it1, it2, it3);
// 遍历时依次输出 a, b, c, d, e
</string></string></string></string>
注意点:
- 组合迭代器不拥有底层数据,也不控制其生命周期;确保子迭代器在组合器使用期间有效
- 线程不安全;如需并发访问,应在外部同步,或改用线程安全集合的迭代器
- 避免循环引用(比如把自身加进自己的组合列表),会导致无限递归或 StackOverflow
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










