optional.filter() 用于对非空 optional 中的值执行 predicate 断言,满足条件则返回原 optional,否则返回 optional.empty();它不是集合筛选,而是单值条件校验,具有短路特性。

Optional.filter() 用于在不为空的前提下,对包装的对象执行条件判断;满足条件则保留原 Optional,不满足则返回空 Optional(Optional.empty())。
filter 的作用和基本逻辑
filter 不是“筛选集合”,而是对 Optional 中的单个值做断言(Predicate)校验。它类似 if 判断的封装:只有当前 Optional 非空 且 值满足给定条件时,才继续向下传递;否则直接短路为 empty。
它的签名是:public Optional<t> filter(Predicate super T> predicate)</t>
常见使用场景和写法
- 过滤 null 安全的业务条件,比如只处理年龄大于 18 的用户
- 配合 map、orElse 等方法组成安全链式调用,避免显式判空
- 替代冗长的 if-present + if-condition 嵌套
实际代码示例
假设有一个 User 类:
class User {
private String name;
private int age;
// 构造、getter 略
}
使用 filter 的典型方式:
Optional<user> userOpt = Optional.of(new User("Alice", 25));
// 只有 user 存在且 age > 18 时,才进入 map;否则跳过
String greeting = userOpt
.filter(u -> u.getAge() > 18) // 条件不满足 → 返回 empty
.map(u -> "Hello, " + u.getName()) // 此处不会执行(若上一步为 empty)
.orElse("No eligible user"); // 输出:"Hello, Alice"
// 若 user 年龄是 16,则 filter 返回 empty,最终输出 "No eligible user"</user>
注意事项
- filter 的 Predicate 不能为 null,否则抛
NullPointerException - filter 不改变原始 Optional 的值,只决定是否“放行”
- 它不抛异常、不打印日志,纯粹是函数式守门员;调试时注意断点位置是否被短路
- 不要在 filter 中写有副作用的操作(如修改对象状态),因为可能不执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











