optional.filter()用于条件过滤:若optional为空则返回empty;若有值且predicate为true则保留原值,否则返回empty,不改变值本身,仅作条件裁剪。

Optional.filter() 用于在 Optional 包装的对象满足指定条件时保留它,否则返回空 Optional(Optional.empty())。它不改变值本身,只做“条件守门人”。
filter 的核心逻辑
filter 接收一个 Predicate<t></t>(即返回 boolean 的函数),对 Optional 中的值调用该判断逻辑:
- 如果 Optional 为空(
empty),直接返回empty,不执行 predicate - 如果 Optional 有值,且 predicate 返回
true,返回原 Optional(值不变) - 如果 Optional 有值,但 predicate 返回
false,返回Optional.empty()
常见使用场景和写法
比如有一个 Optional<string></string>,想只保留非空且长度大于 3 的字符串:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
Optional<string> opt = Optional.of("hello");
Optional<string> result = opt.filter(s -> s != null && s.length() > 3); // ✅ 返回 Optional["hello"]
</string></string>
注意:filter 不会解包或转换值,只是“放行”或“拦截”。它和 map、flatMap 的职责不同——filter 不产生新值,只做条件裁剪。
链式调用中的实际作用
filter 常配合 map、orElse 等方法使用,避免空指针并提升可读性:
- 先用 map 提取字段,再用 filter 验证业务规则
- 比如
Optional<user></user>中取 name 并确保不为空且含特定字符
Optional<user> userOpt = Optional.of(new User("Alice"));
Optional<string> nameOpt = userOpt
.map(User::getName) // 可能为 null
.filter(Objects::nonNull) // 过滤掉 null name
.filter(n -> n.contains("A")); // 进一步业务过滤
</string></user>
容易忽略的关键点
- filter 对 null 值不做自动防护——如果 map 后得到 null,而你没用
filter(Objects::nonNull),后续操作可能 NPE - filter 不抛异常,也不会“修正”数据,不符合条件就静默变 empty
- 多个 filter 可叠加,等价于 and 组合条件,但语义更清晰(比写一个复杂 lambda 更易维护)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










