Java 8 Optional如何仅当非空对象不满足条件时抛出异常
问题原因分析
你当前的实现逻辑是筛选出符合条件(状态为A)的对象,只要最终Optional为空就抛出异常,自然会把原对象为null的场景也判定为需要抛异常的情况,不符合你的需求。
正确实现方案
Java 8+ 通用实现
直接用filter筛选出需要抛异常的场景,也就是非空且不符合校验规则的对象,仅当这类对象存在时抛出异常即可,全程无需显式写null判断:
Optional.ofNullable(nullableObject) // 仅保留非空、且不符合校验规则的对象 .filter(object -> !"A".equals(object.getStatus())) // 只有上述不符合要求的对象存在时才抛异常 .ifPresent(unqualifiedObj -> { throw new BusinessUncheckedException("exception message"); });
该实现完全覆盖所有需求场景:
- 原对象为null:Optional为空,ifPresent无任何操作
- 原对象非空、状态为A:filter后Optional为空,ifPresent无任何操作
- 原对象非空、状态不为A:filter后Optional有值,触发异常抛出
如果你的项目使用Java 9及以上版本,也可以用ifPresentOrElse实现等效逻辑,上述Java 8兼容的写法已经完全满足需求,兼容性更好。
内容的提问来源于stack exchange,提问作者Victor Soares
相关产品推荐
相关产品推荐

