optional.filter()用于对非空值做条件校验:仅当optional有值且满足predicate时返回原optional,否则返回empty;它不修改值、不捕获异常,常与map/orelse等链式使用。

Optional.filter() 用于在不为空的前提下,对内部值进行条件判断;如果值存在且满足条件,返回原 Optional;否则返回空 Optional(Optional.empty())。
filter 的作用和基本用法
filter 不是“筛选多个元素”,而是对单个可能存在的值做断言校验。它接收一个 Predicate<t></t>,类似 if 判断的简化版封装。
常见场景:检查 Optional 中的字符串是否非空、数字是否为正、对象是否满足业务状态等。
- 若 Optional 为空(
empty),直接返回empty,不执行 predicate - 若 Optional 有值,但 predicate 返回
false,也返回empty - 只有“有值 + 满足条件”时,才返回原 Optional
典型使用示例
假设有一个可能为 null 的用户对象,我们想确保其年龄大于 18:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Optional<user> userOpt = Optional.ofNullable(getUser()); Optional<user> adultOpt = userOpt.filter(user -> user.getAge() > 18); </user></user>
此时:
– 如果 getUser() 返回 null → userOpt 为空 → adultOpt 为空
– 如果 user 存在但 age ≤ 18 → adultOpt 为空
– 只有 user 存在且 age > 18 → adultOpt 包含该 user
结合 map、orElse 等方法链式使用
filter 常与 map、orElse、ifPresent 等配合,实现安全的条件转换或默认处理:
-
userOpt.filter(u -> u.isActive()).map(User::getName).orElse("未知用户"):只对激活用户取名字,否则用默认值 -
userOpt.filter(u -> u.getEmail() != null && u.getEmail().contains("@")).ifPresent(this::sendWelcomeEmail):邮箱合规才发邮件
注意点:filter 不改变值,也不抛异常
filter 只做判断,不会修改原始值,也不会因 predicate 抛异常而静默吞掉错误 —— 若 predicate 内部抛出运行时异常(如 NPE),会原样向上抛出。
所以写 predicate 时仍需注意空安全,例如:
- ❌
opt.filter(s -> s.trim().length() > 0)(s 可能为 null,会 NPE) - ✅
opt.filter(s -> s != null && s.trim().length() > 0)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










