网站首页 > 资源文章 正文
java8出来也有一段时间了,不知大家用得还顺手否?如果已经习惯于使用Lambda表达式和Stream流的人一定会经常发现一个特殊的对象:Optional类。今天我要聊的内容都跟Optional这个类有关。
好了,废话不多说,下面进入正题。
Optional是什么
对于Optional是个什么,大家不要想得太复杂。简单得说,就是Java8中新增的一个类,经常配合Stream流和Lambda表达式来使用的类。
那么java8为啥要新增这么一个类呢?总不会是吃饱了撑得没事干吧,所以既然你在java8中看到了它,说明必然有其存在的意义。
至于存在意义为何,我现在也不是很清楚。有种说法叫避免空指针异常问题。我觉得这种说法有点扯。因为我试了几次,如果你不做任何的判断,该抛的异常依然存在。只不过在避免非空问题的处理上确实比传统方式顺眼许多。
下面我将使用一个例子来简单演示一下传统避免空指针和使用Optional避免控制针,代码示例如下:
由上图可知,使用Optional后,避免空指针异常的方式会更加顺眼。至少我是这么觉得的。
既然简单扯了一下何为Optional,那么接下来就该详细说说Optional的用法了。
Optional对象获取
首先我们要能拿到一个Optional对象,那么Optional对象又该如何拿到呢?目前获取Optional类对象的方式有三种:of方法,ofNullable方法和empty方法。
下面的例子演示了三种获取Optional对象的方式:
那么这三种获取Optional对象的方式有何区别呢?这个可以从源码中找到答案。
of方法的源码如下:
ofNullable方法的源码如下:
empty方法的源码如下:
通过对比可以发现,of方法获取Optional对象时,要求传入的值不能为空,而ofNullable则允许传入值的为空,只不过值为空时,构造的是一个Optional的值为空的对象。而empty方法则直接获取一个值为空的Optional对象。
Optional对象的常用方法
既然已经能拿到Optional对象,那么就可以调用该对象自带的一系列方法了。由于本人的JDK为13,所以哪些方法在JDK8上没有,也记得不是很清,所以大家可以先熟练掌握JDK8中能用的,至于别的至少先混个脸熟。
Optional常用的方法如下:
- isEmpty方法
isEmpty方法用来判断该Optional对象中存储的值是否为空,为空返回true,不为空返回false。
isEmpty的示例代码如下:
执行结果如下:
- isPresent方法
isPresent方法也是用来判断Optional对象中存储的值是否不为空的,当Optional对象中存储的值不为空时返回true, 为空时返回false,其判断结果与isEmpty的判断结果相反。
isPresent方法的示例代码如下:
执行结果如下:
- get方法
get方法用来获取Optional中存储的对象值,如果存储的的值为空,则会抛出异常。
get方法的示例代码如下:
执行后结果如下:
- orElse方法
orElse方法也可以获取Optional对象中存储的值,与get不同之处在于,当存储值为空时,会返回orElse传入值,而非抛出异常。
orElse方法的示例代码如下:
执行结果如下:
- or方法
or方法会先判断当前Optional对象存储的值是否为空,不为空则依然返回当前对象,若为空,则根据传入的生产者对象来获取另一个Opitonal对象。当然,通过该生产者对象产生的Optional对象中存储的值不能为空。
or方法的示例代码如下:
执行后结果如下:
- orElseGet方法
orElseGet方法和orElse方法有些类似,都是当Optional对象存储的值为空,根据传入的参数来计算返回值。区别在于orElseGet是根据传入的生产者对象来获取,而orEles是直接将传入的值返回。
orElseGet方法的示例代码如下:
执行结果如下:
- orElseThrow方法
orElseThrow方法的作用是当Optional对象存储的值为空的时候抛出一个异常,当然,若Optional对象存储的值不为空的时候,正常返回。orElseThrow有两个重载版本:一个无参的,一个带参的。无参抛出的是默认的异常,而带参的则会抛出指定的异常。
orElseThrow方法示例代码如下:
执行结果如下图:
- filter方法
filter方法是用来判断该Optional对象中存储的值是否符合传入的判断条件。
若该Optional对象中存储的值为空,则依然返回该对象。当Optional对象中存储的值不为空时,进行条件判断,满足则返回该对象,不满足则返回一个空对象。
filter方法的示例代码如下:
执行结果如下图:
- ifPrsent
ifPresent方法的作用是,当Optional对象存储的值不为空时,通过传入的消费者对象对该值进行处理。若存储值为空,则不做任何处理。
ifPresent方法示例代码如下:
执行结果如下:
- ifPresentOrElse
ifPresentOrElse方法的作用与ifPresent方法有些类似,都是当Optional中存储的值不为空时,使用传入的生产者对象进行处理,区别在于ifPresentOrElse多传入了一个线程执行体对象-Runnable, 当Optional中存储的值为空时,执行该线程执行体,当然,仅仅是作为普通方法调用。至于我为何会这么说,可以看如下源码:
从源码中可知,这里是直接调用的run方法,而开启新线程执行的前提是,需要用Thread类对象接收Runnable对象,并调用Thread类对象的start方法才可以。
下面给出ifPresentOrElse的示例代码:
执行结果如下图所示:
- map
map方法是当Optional中存储的值不为空时,将其转换为另一种类型值的Optional对象。
map方法的示例代码如下:
执行结果如下:
- flatMap
flatMap方法的作用与map方法类似,都是讲当前Optional对象中存储的值经过转换后生成另一个Optional对象,区别在于map只需要提供转换Optional对象中值的转换器即可,而flatMap则必须提供对Optional对象中值的处理并且转换为哪种Optional对象的方法。
flatMap方法的示例代码如下:
执行结果如下:
- stream方法
stream方法的作用是将Optional对象转换为Steam流对象。关于何为Stream流对象,也是Java8新增特性,这里就不过多介绍。
stream方法的示例代码如下:
执行结果如下图所示:
最后,需要提一点的是,Java中还有与Optional类似的专门用来处理Double的OptionalDouble,专门用于处理int的OptionalInt和专门用于处理long的OptionalLong这三个类。其获取方式和常用方法与Optional的方式都大同小异,故不再过多介绍。大家只要类比以一下就能掌握。
猜你喜欢
- 2024-10-28 java新特性之Optional类介绍,解决空指针问题的终极类
- 2024-10-28 Jdk14都要出了,还不能使用 Optional优雅的处理空指针?
- 2024-10-28 「Java8」 你有正确的使用 Optional吗?
- 2024-10-28 深入探讨 Pydantic 中的 Optional 和 Union 类型
- 2024-10-28 漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
- 2024-10-28 Jackson 中使用 Optional(jackson string to object)
- 2024-10-28 还在重复写空指针检查代码?考虑使用 Optional 吧
- 2024-10-28 jdk8的optional深入详解(jdk8 document)
- 2024-10-28 Java 中的 Optional(java optional.of)
- 2024-10-28 吃透 JAVA8 -- Optional 特性全部用法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)