Java 8含空嵌套集合的POJO转换方案(保留配置字段)
Java 8流实现带空警告列表的POJO转换方案
需求回顾
我们需要将Outer对象转换为List<Transformed>,核心要求是:
- 若
warnings不为空且非null,每条Warning对应一条Transformed,填充config和warning的所有字段 - 若
warnings为null或空列表,必须生成一条仅填充config字段、警告字段为null的Transformed
最优流实现方案
可以通过Optional配合Stream的分支处理来实现,既避免空指针,又满足所有场景需求:
import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; public class Transformer { public List<Transformed> transform(Outer outer) { // 先获取配置(若config可能为null,可额外加Optional处理,这里假设config必存在) Config config = outer.config; // 处理警告列表:null/空列表时生成含单个null的流,否则直接转流 Stream<Warning> warningStream = Optional.ofNullable(outer.warnings) .filter(warnings -> !warnings.isEmpty()) .map(List::stream) .orElseGet(() -> Stream.of((Warning) null)); // 映射生成Transformed实例 return warningStream.map(warning -> { Transformed transformed = new Transformed(); transformed.configId = config.configId; transformed.configName = config.configName; if (warning != null) { transformed.warningId = warning.warningId; transformed.warningName = warning.warningName; } // 警告字段默认即为null,无需额外赋值 return transformed; }).collect(Collectors.toList()); } }
方案说明
- 空列表/Null处理:用
Optional.ofNullable(outer.warnings)包裹警告列表,先过滤掉空列表,若最终没有有效流(即原列表为null或空),则通过orElseGet生成一个包含null的单元素流,保证至少会生成一条Transformed实例。 - 映射逻辑:遍历流中的每个元素(可能是
Warning实例或null),填充config字段后,根据元素是否为null决定是否填充警告字段。 - 灵活性:如果
config也可能为null,只需在开头添加Optional.ofNullable(config)的判断,比如给默认值或抛出异常,适配业务场景。
与传统循环的对比
传统嵌套循环(带空检查)也能实现需求,但流的写法更简洁,函数式风格的代码可读性更高,尤其是空值处理部分用Optional替代了繁琐的if (warnings == null || warnings.isEmpty())判断,代码更优雅。
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

