Java 8 Optional用法:如何正确改写现有Optional相关业务代码
Java 8 Optional 代码改写方案
你原来的写法属于对Optional的典型误用,isPresent()+分支判断的逻辑和传统的null判断没有本质区别,完全没有用到Optional的链式调用特性。
最优改写代码
直接用map()方法即可,它会自动处理入参为空的场景,无需手动判断:
Optional<String> getNameBySiiPriorityInfo(Optional<SiiPriorityInfo> siiPriorityInfo){ return siiPriorityInfo.map(SiiPriorityInfo::getName); }
map()的执行逻辑和你的原始代码完全等价:
- 当入参
siiPriorityInfo是空(Optional.empty())时,直接返回空的Optional,不会执行取值逻辑 - 当入参有值时,调用
SiiPriorityInfo.getName(),并自动将返回值用Optional.ofNullable包装后返回,完美覆盖name字段本身为空的场景
补充Optional最佳实践
- 不推荐把Optional作为方法入参传递,这是Java官方文档明确不建议的用法。Optional的设计初衷是作为方法返回值,用来显式告知调用方返回结果可能为空,避免空指针异常。你的方法更合理的写法应该是直接传实体对象:
Optional<String> getNameBySiiPriorityInfo(SiiPriorityInfo siiPriorityInfo){ return Optional.ofNullable(siiPriorityInfo) .map(SiiPriorityInfo::getName); } - 不到万不得已不要调用
get()方法,如果你没有提前做isPresent()判断,get()还是会抛出NoSuchElementException,和空指针没有本质区别。优先用orElse()、orElseGet()、orElseThrow()这类安全方法提取Optional里的值。 - 不要用Optional包装集合类型、不要把Optional作为类的成员属性、不要在序列化场景里使用Optional,它没有实现
Serializable接口。
内容的提问来源于stack exchange,提问作者Sasha
相关产品推荐
相关产品推荐

