java中遍历嵌套集合的核心是递归展开与迭代器链式调用,需通过递归判断类型或栈模拟实现惰性扁平化,不可直接用单层iterator遍历;支持固定深度手动嵌套遍历、任意深度类型判别递归、自定义flatiterator封装及stream.flatmap简化。

Java 中用 Iterator 遍历嵌套集合(比如 List<list>></list> 或树形结构),核心是**递归展开 + 迭代器链式调用**,不能直接用单层 Iterator 一撸到底。
用嵌套 Iterator 手动遍历两层 List
对 List<list>></list> 这类固定深度结构,外层获取 Iterator<list>></list>,内层对每个子列表再获取 Iterator<t></t>:
List<list>> nested = Arrays.asList(
Arrays.asList("a", "b"),
Arrays.asList("c"),
Arrays.asList("d", "e", "f")
);
Iterator<list>> outer = nested.iterator();
while (outer.hasNext()) {
List<string> innerList = outer.next();
Iterator<string> inner = innerList.iterator();
while (inner.hasNext()) {
System.out.println(inner.next());
}
}</string></string></list></list>
用递归 + Iterator 处理任意深度嵌套(如 List
当嵌套类型不统一(例如元素可能是 String 或 List>),需判断类型并递归处理:
- 遇到
List:获取其Iterator,递归遍历每个元素 - 遇到非
List类型(如String、Integer):直接处理或收集 - 注意避免无限递归(比如自引用集合),可加深度限制或已访问标记
示例(简易扁平化):
public static void flattenAndPrint(Iterator> it, int depth) {
if (depth > 10) return; // 防栈溢出
while (it.hasNext()) {
Object item = it.next();
if (item instanceof List) {
flattenAndPrint(((List>) item).iterator(), depth + 1);
} else {
System.out.println(item);
}
}
}
// 调用:flattenAndPrint(nested.iterator(), 0);
封装成自定义 FlatIterator(支持 hasNext/next 的扁平迭代器)
更工程化的做法是实现一个“扁平迭代器”,把嵌套结构预展平或惰性展平:
- 构造时传入根集合,用栈保存各层未完成的
Iterator -
hasNext():不断尝试从栈顶迭代器取下一个有效元素,遇到List就压入其迭代器 -
next():返回上一步找到的元素 - 优势:对外表现像普通
Iterator<t></t>,可直接用于 for-each 或 Stream 支持
替代方案:用 Stream.flatMap 简化(Java 8+)
虽然问题问的是 Iterator,但实际开发中,用 Stream 更简洁直观:
nested.stream()
.flatMap(subList -> subList.stream())
.forEach(System.out::println);
若必须用 Iterator 接口(比如对接老代码),可将 Stream 结果转为 Iterator:
Iterator<string> flatIter = nested.stream()
.flatMap(List::stream)
.iterator();</string>
不复杂但容易忽略:嵌套遍历时,Iterator 本身不感知嵌套语义,得靠逻辑拆解;递归和栈是两种主流思路,选哪个取决于是否需要延迟计算和内存控制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











