点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
作者 | zjhred
来源 | http://8rr.co/hsLh
引言
在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示
在这种情况下,有如下代码 user.getAddress().getProvince();
这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法
![8828e8b2ef23fd8bd02bf0619a71a488.png](https://i-blog.csdnimg.cn/blog_migrate/60de10c9e4f0dbb222c03c92b7f7639b.jpeg)
Optional(T value),empty(),of(T value),ofNullable(T value)
这四个函数之间具有相关性,因此放在一组进行记忆。
先说明一下,Optional(T value),即构造函数,它是private权限的,不能由外部调用的。其余三个函数是public权限,供我们所调用。那么,Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。好吧,这么说还是比较抽象。直接上Optional(T value)构造函数的源码,如下图所示
![2714eb7e532e6139e0b72bb918c23dee.png](https://i-blog.csdnimg.cn/blog_migrate/1a83a588a4b5edc8d38d50d7a6e4ab1f.png)
![710eb3ce47fd56a3e11f1ab5cd8d2c8c.png](https://i-blog.csdnimg.cn/blog_migrate/c0eebf04de12a87c6415010782172c8e.jpeg)
- 通过of(T value)函数所构造出的Optional对象,当Value值为空时,依然会报NullPointerException。
- 通过of(T value)函数所构造出的Optional对象,当Value值不为空时,能正常构造Optional对象。
![0e8dd9eab9f2ef6d8b42f6a01ee67d13.png](https://i-blog.csdnimg.cn/blog_migrate/6fe0557cfa8881e71367089972e42f5a.jpeg)
empty()
的作用就是返回EMPTY对象。
好了铺垫了这么多,可以说
ofNullable(T value)
的作用了,上源码
![dfaabe73e6eecbc68dd32921da547b2c.png](https://i-blog.csdnimg.cn/blog_migrate/376eedd543eb8a9969797d2dba5c21ad.jpeg)
orElse(T other),orElseGet(Supplier extends T> other)和orElseThrow(Supplier extends X> exceptionSupplier)
![e1d67a2d73a3ef6175a7fbaaf81e685b.png](https://i-blog.csdnimg.cn/blog_migrate/c682e924fd367de6f4e856cdd93a590e.jpeg)
![362073d988faece454c8c4dcc770afbc.png](https://i-blog.csdnimg.cn/blog_migrate/59cb312856f633c2e2e902a7640a06c4.jpeg)
map(Function super T, ? extends U> mapper)和flatMap(Function super T, Optional> mapper)
![86d5db3d7f04fcf49e4e04bf0ec1d865.png](https://i-blog.csdnimg.cn/blog_migrate/a581c9925de633226c7cc12a58923a81.jpeg)
Function super T, ? extends U>
Function super T, Optional>
![e1bbd4ab92f226d7b44df91f65c51042.png](https://i-blog.csdnimg.cn/blog_migrate/7b20089c865acfbe8482fa2fcca5e826.jpeg)
![2878c02d6c7ab466c61a796f7fe32c91.png](https://i-blog.csdnimg.cn/blog_migrate/5d5db2ce931347cccc7c7ee61fbfd655.jpeg)
![e45fc106c5ed8f5bf0d4f3a5db8e7b53.png](https://i-blog.csdnimg.cn/blog_migrate/9844be3a5d52784de5bcb14cf8f53dd5.jpeg)
![4348e5630ada67d02c7c861f91a561a6.png](https://i-blog.csdnimg.cn/blog_migrate/23061fbfd25d873a7267efe16568cf7a.jpeg)
isPresent
即判断value值是否为空,而
ifPresent
就是在value值不为空时,做一些操作。这两个函数的源码如下
![dd62e7f671cb6ac64d886ec277f9ce6a.png](https://i-blog.csdnimg.cn/blog_migrate/a972e6bb8553b22ea8bb01ed603fea03.jpeg)
![169707036fd328eb5e14e3cfa7cc5a9b.png](https://i-blog.csdnimg.cn/blog_migrate/8d9d1ab66cbf46752f4f22ec2bc9da88.jpeg)
![4a6379468b57b8a6d193b90c96e3a479.png](https://i-blog.csdnimg.cn/blog_migrate/3fa1d4063e004676f044ee0e583aeb22.jpeg)
ifPresent(Consumer super T> consumer)
,用法也很简单,如下所示
![6553ccdc1ee56a99c370ad8d1dfe03c1.png](https://i-blog.csdnimg.cn/blog_migrate/59b27c8a436ca6f184848fbdd292f18a.jpeg)
![dbecaaaecfe4aeab0dbbb51dd87bd40d.png](https://i-blog.csdnimg.cn/blog_migrate/edcb02f14498112ace27fed90085ad73.jpeg)
Predicate
来对
Optional
中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回
Optional.empty
。
用法如下
![e8985a50a2b84e0aaa1d469db136c764.png](https://i-blog.csdnimg.cn/blog_migrate/9bf9be18ab181bdc314c71bf51a6e019.jpeg)
实战使用
例一 在函数方法中, 以前写法![502a9bbb907a19ad4a41c75277274cbd.png](https://i-blog.csdnimg.cn/blog_migrate/887d5a7194311c8f7da232bc38f206ab.jpeg)
![92ba0f9f9139d1f7d538b773c0e361b1.png](https://i-blog.csdnimg.cn/blog_migrate/f04955f72af6d3010def6a90861f3b75.jpeg)
![857dd53db410986c5bab56cd85e9979f.png](https://i-blog.csdnimg.cn/blog_migrate/f3ba83523cbfd287adc2f460feff5110.jpeg)
![864faa20f6a46f3dd50585810dbbae33.png](https://i-blog.csdnimg.cn/blog_migrate/56d05c5999989f8013cf682d38dda0ec.jpeg)
![e6a9a6528db2304cf3b3ed944cf81210.png](https://i-blog.csdnimg.cn/blog_migrate/be857c84f99d368177c40dde98c2aa4a.jpeg)
![9036e95b19d9db88b0f61bb4b20bfcad.png](https://i-blog.csdnimg.cn/blog_migrate/3916cf6ccdfd354ecdb787339eb95507.jpeg)
往期推荐
看完这篇还不了解 Nginx,那我就哭了!
springboot-@Async默认线程池导致OOM问题
7000字 Redis 超详细总结笔记总 | 收藏必备!
对MySQL的锁了解吗
Spring 最常用的 7 大类注解
Kafka 事务之偏移量的提交对数据的影响
中国互联网史就是一部流氓史!
如何干掉恶心的 SQL 注入?
Linux 最常用命令
MyBatis 事务管理解析:颠覆你心中对事务的理解!
好文章,我 在看 ❤️