Java Stream API 不自动处理 null,NPE 常在 map、flatMap、filter、toMap、sorted 等环节触发;应通过 filter(Objects::nonNull) 过滤 null 元素,用 Optional.ofNullable().orElse() 处理可能为 null 的值,toMap 时防 value 为 null,findFirst() 后禁用 get() 而用 orElse 或 ifPresent。

Java Stream API 本身不自动处理 null 值,空指针异常(NullPointerException)往往在 map、flatMap、filter、collect(如 toMap)、sorted 等环节触发,根源是代码对 null 元素或 null 返回值做了非空假设。关键不是“避免用 Stream”,而是明确在哪一步可能出 null、并针对性防护。
过滤 null 元素是最直接有效的做法
当集合中存在 null 元素(比如 Arrays.asList("a", null, "c")),直接调用 map(String::toUpperCase) 就会崩。此时应在 map 前用 filter 切断风险路径:
-
stream().filter(Objects::nonNull).map(...)—— 适用于可以丢弃 null 数据的场景 - 若元素是对象,需检查具体字段是否为 null:
filter(p -> p != null && p.getName() != null) - 注意:
filter不会改变原集合,只是让 null 元素不进入后续操作链
用 Optional 包装 + 显式兜底更可控
不想丢数据,又想避免运行时崩溃,可以把可能为 null 的值转成 Optional,再统一提供默认值:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
.map(p -> Optional.ofNullable(p.getName()).orElse("未知"))- 配合
flatMap处理可能返回 null 的集合:flatMap(p -> Optional.ofNullable(p.getItems()).orElse(Collections.emptyList()).stream()) - 优势是逻辑清晰、所有分支可见,适合对数据完整性有要求的业务
toMap 报 NPE?重点防 value 为 null
Collectors.toMap(keyMapper, valueMapper) 内部使用 HashMap::put,而 HashMap 明确禁止 null value(key 可为 null,但 value 不行)。报错不是因为 key 是 null,而是 value 是 null:
立即学习“Java免费学习笔记(深入)”;
- 快速修复:加
filter排除 value 为 null 的项 - 保留条目:用
orElse("N/A")或orElseGet(() -> generateDefault())替换 null value - 进阶方案:自定义 Collector 绕过 HashMap 的 null 检查(仅限特殊需求,一般不推荐)
findFirst().get() 是隐形炸弹,必须判空
findFirst() 返回 Optional,它的 get() 方法在无值时抛 NoSuchElementException(虽不是 NPE,但常被误认为空指针)。正确姿势是:
- 用
orElse(null)、orElseGet(() -> new DefaultObj())提供默认结果 - 用
ifPresent(...)或map(...).orElse(null)做安全链式处理 - 绝对不要在未确认
isPresent()的情况下调用get()

















