使用 filter(Objects::nonNull) 是最简洁安全的判空过滤方式,适用于基础过滤、映射后过滤,并可结合 Optional.flatmap 或 Optional.ofNullable 做边界防护。

直接用 filter(Objects::nonNull) 是最简洁、安全、符合规范的做法。它语义清晰、性能好,且能避免空指针异常。
基础过滤:移除集合本身的 null 元素
当 List 或数组本身含 null(如 Arrays.asList("a", null, "b")),只需一步过滤:
- 用
Objects::nonNull替代item != null—— 更具可读性,也统一了判空风格 - 写法示例:
List<String> clean = list.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
映射后过滤:处理方法返回可能为 null 的场景
常见于 map() 调用外部查找方法(如 findUserById()),结果可能为 null。此时不能把判空塞进 filter 里做副作用逻辑,而应分两步:
- 先
map出候选对象(允许为 null) - 再
filter(Objects::nonNull)剔除无效项 - 推荐写法:
List<User> users = ids.stream()
.map(this::findUserById)
.filter(Objects::nonNull)
.collect(Collectors.toList());
升级方案:用 Optional + flatMap 避免显式 null
若你控制被调用方法(如 findUserById),更健壮的方式是让它返回 Optional<User>:
立即学习“Java免费学习笔记(深入)”;
- 修改方法签名,用
Optional.ofNullable(...).findFirst()等封装结果 - 主流程改用
flatMap:
List<User> users = ids.stream()
.flatMap(id -> findUserById(id).stream())
.collect(Collectors.toList());
——Optional.stream()自动跳过空值,无需额外filter
边界防护:源集合本身可能为 null
如果原始 List 可能为 null(如远程调用返回值),需先兜底:
- 用
Optional.ofNullable(list).orElse(Collections.emptyList())安全转流 - 或 Java 9+ 可结合
Stream.ofNullable(但注意它只接受单个元素,常配合flatMap使用):
list == null ? Stream.empty() : list.stream() 更直白


















