optional 的 filter 和 map 组合可安全链式处理空值与条件逻辑:filter 在值非空且满足谓词时保留,map 安全转换并保持 optional 类型,二者串联实现“有则处理、无则跳过”,再通过 orelse/orelseget 落地默认值,彻底避免 nullpointerexception。

用 Optional 的 filter 和 map 组合,可以把嵌套的 null 判断、条件过滤和转换逻辑,压缩成一条可读性强、无副作用的链式调用,避免 if (obj != null) 套娃。
filter 用来做安全的条件筛选
filter 不会解包,只在值存在且满足谓词时才保留,否则返回空 Optional。它天然规避了对 null 调用方法的风险。
- 传统写法:
if (user != null && user.getAge() > 18) { ... } - Optional 写法:
Optional.ofNullable(user).filter(u -> u.getAge() > 18) - 关键点:
u在 lambda 中一定是非null的,因为filter只在值存在时才执行谓词
map 用来做安全的值转换
map 接收一个函数,对内部值做转换;若原 Optional 为空,则直接返回空,不执行函数——彻底消除 NullPointerException。
- 传统写法:
String name = user != null ? user.getName() : null; - Optional 写法:
Optional.ofNullable(user).map(User::getName) - 注意:
map返回仍是Optional<string></string>,不是String,适合继续链式操作
filter + map 组合实现“有则处理、无则跳过”
把两者串起来,就能表达「如果对象存在且符合条件,就取它的某个属性」这类常见逻辑,一行搞定:
- 例子:获取成年用户的邮箱(要求用户非空、年龄 ≥18、邮箱非空)
Optional.ofNullable(user)<br> .filter(u -> u.getAge() >= 18)<br> .map(User::getEmail)<br> .filter(Objects::nonNull)
- 最后一层
filter(Objects::nonNull)是为了确保邮箱本身也不为null,这是对字段级空值的二次防护 - 整个链条不会抛 NPE,也不会出现
Optional.empty().get()这类危险调用
搭配 orElse / orElseGet 让结果落地
链式处理完后,用 orElse 或 orElseGet 提供默认值,让 Optional “走出来”:
-
.orElse("no-email@example.com")—— 简单常量默认值 -
.orElseGet(() -> generateDefaultEmail())—— 延迟计算,默认值生成开销大时推荐 - 避免用
get(),它在空时抛异常,违背 Optional 设计初衷
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











