Java使用Jackson解析嵌套对象后如何直接遍历深层嵌套列表?
嵌套集合扁平化遍历方案
可以通过Java 8及以上版本提供的Stream API实现,无需编写多层嵌套for循环,具体实现如下:
基础实现(假设中间层级属性均不为空)
如果你的实体类的dto、segments属性运行时不会为null,可以直接使用如下代码:
rootNode.visibleEntities.stream() .flatMap(v -> v.dto.segments.stream()) .filter(s -> s.transfer != null) .forEach(s -> System.out.println(s.transfer.getName()));
如果你的实体类属性是私有字段,使用getter方法取值,对应调整为:
rootNode.getVisibleEntities().stream() .flatMap(visibleEntity -> visibleEntity.getDto().getSegments().stream()) .filter(segment -> segment.getTransfer() != null) .forEach(segment -> System.out.println(segment.getTransfer().getName()));
实现说明
- 核心通过flatMap操作完成嵌套集合扁平化:它会把每一个
VisibleEntities实例对应的List<Segments>转换为独立的Segments元素流,再把所有流合并为单层的Segments流,直接消除了外层循环 - 后续通过filter过滤掉transfer为null的元素,最终直接遍历输出即可
健壮性增强实现
如果运行时可能出现VisibleEntities为null、dto为null、segments为null的场景,可以增加空值过滤逻辑避免空指针异常:
import java.util.Objects; import java.util.Collection; // 省略其他代码 rootNode.getVisibleEntities().stream() .filter(Objects::nonNull) .map(VisibleEntities::getDto) .filter(Objects::nonNull) .map(Dto::getSegments) .filter(Objects::nonNull) .flatMap(Collection::stream) .filter(segment -> segment.getTransfer() != null) .forEach(segment -> System.out.println(segment.getTransfer().getName()));
内容的提问来源于stack exchange,提问作者Al Grant
相关产品推荐
相关产品推荐

