目录
一、概述
二、使用
1、创建对象
2、安全消费值
3、安全获取值
4、过滤
5、判断
6、数据转换
一、概述
我们在编码的时出现最多的就是空指针异常,所以在很多情况下我们需要做各种非空的判断。
尤其是对象中的属性还是一个对象的情况下,这种判断会让代码显得臃肿
所以在JDK8中引入了Optional,可以写出更优雅的代码来避免空指针异常
并且在很多函数式编程相关的API中也都用到了Optional,如果不会使用Optiona也会对函数式编程的学习造成影响。
二、使用
1、创建对象
Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部。然后我们去使用Optional中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常。
我们一般使用Optional的静态方法ofNullable来把数据封装成一个Optional对象。无论传入的参数是否为null都不会出现问题
你可能会觉得还要加一行代码来封装数据比较麻烦。但是如果改造下getAuthor方法,让其的返回值就是封装好的Optional的话,我们在使用时就会方便很多。
而且在实际开发中我们的数据很多是从数据库获取的,Mybatis从3.5版本可以也已经支持Optional了,我们可以直接把dao方法的返回值类型定义成Optional类型,MyBastis会自己把数据封装成Optional对象返回。封装的过程也不需要我们自己操作。
如果你确定一个对象不是空的则可以使用optional的静态方法of来把数据封装成Optional对象
但是一定要注意,如果使用of的时候传入的参数必须不为null。 (尝试下传入null会出现什么结果)
如果一个方法的返回值类型是ptional类型。而如果我们经判断发现某次计算得到的返回值为null,这个时候就需要把nul封装成ptional对象返回。这时可以使用optional的静态方法empty来进行封装
aptiona1.empty()
2、安全消费值
我们获取到一个Optiona对象后肯定需要对其中的数据进行使用。这时候我们可以使用其ifPresent方法对来消费其中的值。这个方法会判断其内封装的数据是否为空,不为空时才会执行具体的消费代码。这样使用起来就更加安全了。例如,以下写法就优雅的避免了空指针异常
3、安全获取值
如果我们期望安全的获取值,不推荐使用Optional的get,而是以下方法
ofElseGet:获取数据并设置数据为空的默认值,如果数据不为空就获取数据值,如果为空则根据你传入的参数来创建对象作为默认值返回
ofElseThrow:如果数据不为空就获取该数据,为空则根据你传入的参数来创建异常抛出
4、过滤
我们可以用filter方法对数据过滤,如果原本有数据的,但是不符合判断也会变无数据的Optional
5、判断
可以用isPresent方法进行是否存在数据的判断,如果空返回false,有数据返回true,更推荐使用ifPresent方法
6、数据转换
map方法可以让我们数据进行转化,并且得到数据是被Optional包装好的,包装使用安全