java stream处理null需按场景选择策略:直接去空用filter(objects::nonnull);转换后去空应map→filter(objects::nonnull)或flatmap(optional::stream);源头可能为空则用optional.ofnullable或stream.ofnullable包裹。

Java Stream API 处理集合中 null 值,核心不是“怎么写 filter”,而是“在哪过滤、为什么这么过滤”。关键在于区分三种常见场景:直接去空、转换后去空、源头可能为空——每种对应不同写法和取舍。
直接过滤集合本身的 null 元素
这是最基础的用法。原 List 中已有 null,只需保留非 null 项:
- 用 filter(Objects::nonNull),语义清晰、性能好、无歧义
- 必须接 .collect(Collectors.toList()) 或 .toList()(Java 16+),否则流不会执行,原列表也不变
- 若想原地修改(如 ArrayList),改用 removeIf(Objects::isNull),更省内存,但不适用于不可变集合(如 Arrays.asList 返回的)
先 map 再过滤生成的 null
典型场景:对每个元素调用一个可能返回 null 的方法(如查找关联对象、解析字段),只保留有效结果:
- ❌ 错误写法:在 filter 里调用 findXxx() 并判空,混入副作用和逻辑判断
- ✅ 正确链路:map → filter(Objects::nonNull) →(可选)再 map 回目标类型
- 更优解是配合 Optional:把 findXxx() 改成返回 Optional,然后用 flatMap(Optional::stream),天然跳过空值,代码更简洁且线程安全
应对整个集合可能为 null 的情况
上游数据源不稳定(如远程调用返回 null List),需避免 NPE:
- 用 Optional.ofNullable(list).orElse(Collections.emptyList()) 包一层,再走 stream 流程
- Java 9+ 可用 Stream.ofNullable(list) 直接转流,但注意它只处理顶层 null,不处理 list 内部元素
- 如果 list 是 null,Stream.ofNullable(list) 会返回空流;如果 list 非 null,它等价于 list.stream()
嵌套结构或属性级 null 检查
集合元素非 null,但其字段(如 user.getName())可能为 null,后续操作易崩:
- 在 map 或 filter 中显式检查字段:.filter(u -> u != null && u.getName() != null)
- 或用 Objects.nonNull 组合:.filter(u -> Objects.nonNull(u) && Objects.nonNull(u.getName()))
- 避免只判元素不判字段——filter(Objects::nonNull) 对这种场景无效
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











