Java8:Optional - 解救分支地狱
相信任何一个Java开发者都会遇到NPE(即NullPointerException),而为了避免出现NPE,通常的方法是在访问对象前进行判空,即使用分支语句进行判断if (xx != null)。
但是,过多的分支语句(尤其是和业务逻辑结合起来后),会导致代码可读性和可维护性的下降,因此需要减少它的出现。还好Java8提供了Optional这个工具,能够消除大部分判空和一部分普通判断。
Optional
Optional<T>
代表一种有或为空的数据,使用Optional.ofNullable()可以创建一个接受null的Optional,而使用Optional.of()创建Optional时,传入参数为null就会立即抛出NPE。本文并非介绍Optional中各个方法的使用,而是在具体情形下的Optional取代if的实例。
替代判空分支
绝大部分的判空分支可以被Optional替代。
1 | Object sth = ...; |
均可使用Optional的对应方法重构:
1 | // 为空抛出业务异常 |
安全链式调用
1 | Object result = sth.getA().getB().getC().getD().getE(); |
链式调用写起来确实爽,可是用着的时候其中如果有一个是null,那就要抓狂了😫,而且由于null的字段可能不确定,因此可能需要嵌套分支或者使用一个超长条件分支判空。
1 | if(sth.getA() != null){ |
使用Optional的map方法可以避免这一点:
1 | Optional.ofNullable(sth).map(xxx::getA).map(yyy::getB)... |
复制代码
map会自动对返回值包装成Optional,与map相对的还有flatMap方法,它只接受返回为Optional的方法引用。引入flatMap是为了防止出现多重包装,例如Optional
1 | public class X{ |
替代部分条件判断分支
Optional也能替代一些简单的Bean条件判断,利用的是filter这个方法。
1 | XXX sth = ... |
使用if的优秀实践
即使是必须使用if的情况,也存在着一些技巧可以优化代码的结构。一个原则是:尽量减少代码嵌套,代码短的分支路径写在if下,必要时反转if。
一种思想是将if作为判断特殊条件的过滤器,及时判断「异常状态」并返回,以登录为例:
1 | if(checkPassword(password,userInput)){ |
- 本文标题:Java8:Optional - 解救分支地狱
- 本文作者:Nosa
- 本文链接:https://hr2812.cn/2020/10/20/java-8-optional-demo/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!