JDK8新增的Optional类的常用方法

一、摘要nullpointerexception,中文名: 空指针异常 ,也简称 npe,是软件系统中最常见的错误异常之一。
很久以前 google guava 项目引入了optional作为解决空指针异常的一种方式,不赞成写过多的代码来显式检查null,以期望程序员写出整洁同时可读性更高的代码。
受 google guava 的影响,optional 现在也成为了java 8 及以上库代码的一部分。
在介绍optional技术之前,我们不禁会发出一个疑问:为什么谷歌不赞成写过多的代码来显式检查null?
下面是某个常见的参数判空代码,样例如下。
// 判断行政区是否为空if(country != null){ // 判断行政区的上一级,行政城市是否为空 if(country.getcity() != null){ // 判断行政城市的上一级,行政省是否为空 if(country.getcity().getprovince() != null){ // 获取对应的行政省相关的数据 return country.getcity().getprovince().getname(); } }}这还是最普通的三层判断,假如有很大一段业务逻辑处理的时候,你会发现代码不光看起来很臃肿,并且难以阅读,可读性很差!
如果调整为使用optional来编写的话,可以转换成如下写法:
// 获取当前行政区最顶级的省信息名称string result = optional.ofnullable(country) .map(country::getcity) .map(city::getprovince) .map(province::getname) .orelse(error);采用optional来编程之后,整个代码的可读性和整洁度,是不是要干净很多!
这也是为什么推荐大家使用optional的原因啦!
当然废话也不多说,代码直接撸起来!
二、案例实践在 jdk8 中,optional 共有 12 个核心方法,下面我们一起来看看他们的用法!
2.1、empty()empty 方法返回一个不包含值的 optional 实例,单独使用没什么意义,主要和其他方法搭配使用。
optional optional = optional.empty();system.out.println(optional);-- 输出结果optional.empty2.2、of()of 方法会返回一个 optional 实例,如果传入的值非空,会返回包含指定值的对象;如果传入空,会立刻抛出空指针异常。
// 非空情况下,会正常返回optional optional = optional.of(hello world);system.out.println(optional);-- 输出结果optional[hello world]// 为空情况下,会抛空指针异常optional optional = optional.of(null);system.out.println(optional);-- 输出结果exception in thread main java.lang.nullpointerexception at java.util.objects.requirenonnull(objects.java:203) at java.util.optional.(optional.java:96) at java.util.optional.of(optional.java:108)2.3、ofnullable()ofnullable 方法会返回一个 optional 实例,如果传入的值非空,会返回包含指定值的对象;如果传入空,会返回不包含任何值的 empty 对象,也就是最开始介绍的optional.empty()对象。
// 非空情况下,会正常返回optional optional = optional.ofnullable(hello world);system.out.println(optional);-- 输出结果optional[hello world]// 为空情况下,会返回 empty 对象optional optional = optional.ofnullable(null);system.out.println(optional);-- 输出结果optional.empty2.4、ispresent()ispresent 方法用来判断实例是否包含值,如果包含非空值,返回 true,否则返回 false。
// 非空值,返回trueboolean rs1 = optional.ofnullable(hello).ispresent();system.out.println(rs1);// 空值,返回falseboolean rs2 = optional.ofnullable(null).ispresent();system.out.println(rs2);-- 输出结果truefalse2.5、get()get 方法,如果实例包含非空值,则返回当前值;否则抛出 nosushelementexception 异常。
// 非空值,返回当前值object rs = optional.ofnullable(hello world).get();system.out.println(rs);-- 输出结果hello world// 空值,会抛出 nosushelementexception 异常object rs = optional.ofnullable(null).get();system.out.println(rs);-- 输出结果exception in thread main java.util.nosuchelementexception: no value present at java.util.optional.get(optional.java:135)2.6、ifpresent()ifpresent 方法作用是当实例包含非空值时,执行传入的 consumer,比如调用一些其他方法;如果包含的值为空,不执行任何操作。
optional.ofnullable(hello world) .ifpresent( x - > { system.out.println(x); });-- 输出结果hello world2.7、filter()filter 方法用于过滤不符合条件的值,接收一个predicate参数,如果符合条件,会返回当前的optional实例,否则返回 empty 实例。
optional.ofnullable(hello world) .filter(x - > x.contains(hello)) .ifpresent(x - > { system.out.println(x); });-- 输出结果hello world2.8、map()map 方法是链式调用避免空指针的核心方法,当实例包含值时,对值执行传入的function函数接口方法,并返回一个代表结果值新的optional实例,也就是将返回的结果再次包装成optional对象。
optional.ofnullable(hello+world) .map(t - > { if(t.contains(+)){ return t.replace(+, ); } return t; }).ifpresent(t - > { system.out.println(t); });-- 输出结果hello world2.9、flatmap()flatmap 方法与 map 方法类似,唯一不同的地方在于: 需要手动将返回的值,包装成optional实例,并且参数值不允许为空 。
optional.ofnullable(hello+world) .flatmap(t - > { if(t.contains(+)){ t = t.replace(+, ); } // 不同之处 return optional.of(t); }).ifpresent(t - > { system.out.println(t); });-- 输出结果hello world2.10、orelse()orelse 方法作用是如果实例包含非空值,那么返回当前值;否则返回指定的默认值。
object rs = optional.ofnullable(null).orelse(null);system.out.println(rs);-- 输出结果null2.11、orelseget()orelseget 方法作用是如果实例包含非空值,返回这个值;否则,它会执行作为参数传入的supplier函数式接口方法,并返回其执行结果。
object result = optional.ofnullable(null) .orelseget(() - > { return error; });system.out.println(result);-- 输出结果error2.12、orelsethrow()orelsethrow 方法作用是如果实例包含非空值,返回这个值;否则,它会执行作为参数传入的异常类。
optional.ofnullable(null) .orelsethrow(() - > new runtimeexception(参数为空));-- 输出结果exception in thread main java.lang.runtimeexception: 参数为空 at com.x.x.x.x.optionaltest.lambda$main$10(optionaltest3.java:144) at java.util.optional.orelsethrow(optional.java:290)三、小结以上就是 jdk8 新增的optional类的常用方法总结,其中ofnullable、map和orelse方法搭配使用的最多。
另外orelse、orelseget、orelsethrow区别如下:
orelse:如果实例包含空值,返回传入指定的值orelseget:如果实例包含空值,返回传入的方法中返回值orelsethrow:如果实例包含空值,返回指定的异常类型在实际使用的时候,还得结合具体的场景进行合理选择,有时候并不是全部采用optional来解决npe异常代码才更加优雅,比如当前对象比较简单,就是一个简单判断,通过obj != null足以解决问题。
因此在保证业务功能的正确和稳定性的基础之上,适当的选择相关的工具来优化代码的整洁度和可读性,更能发挥出锦上添花的效果!

小米6最新消息:vivoxplay6开启镇压模式除骁龙835处处碾压小米6
百度和智米科技开展合作,呼喊小度控制智米系列家电产品
十种变频器维修方法,值得收藏!(2)
微星2010校园硬件超频争霸赛盛大启动
村田交通量可视化的交通计数系统为印尼提供据服务
JDK8新增的Optional类的常用方法
韩国半导体SunLike开挂 照耀庞贝古城遗址
红米Note5什么时候上市?红米Note5最新消息:全面屏搭OPPOR11同款处理器,红米Note5依然超值!
线上师资培训 | 苏州大学-嵌入式技术与实践课程分享(提前报名有赠书福利)
Xsens推出微型惯性导航系统(INS)模块MTi-7 提供精确、实时的定位、速率和方向数据流
化工厂巡检机器人—化工厂安全管理之道
作为机器人强国,日本在2017年取得的成果十分丰富,且与本国国情紧密结合
为什么iPhone12Pro没有坚持使用5.8英寸的屏幕?
触控电路图工作原理
华为P30Pro真机上手_后置摄像头很惊艳
如何使用Proteus制作PCB步骤图解
荣耀新品发布会锁定1216 魔幻概念机来袭
二极管箝位中压三电平变频器系统设计
AMD CFO:在65纳米技术方面正在赶上英特尔
国内首份!百度与同济大学联合发布自动驾驶法律责任白皮书