![从企业级开发到云原生微服务:Spring Boot实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/257/33831257/b_33831257.jpg)
2.6 Optional
Optional类是可以解决空指针异常(NullPointException)的问题。它可以作为任意类型T的对象的容器,它可以在对象值不为空的时候返回值。当值为空时,可以预先做处理,而不是抛出空指针异常。
2.6.1 获得Optional
◎Optional.emtpty():获得空的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_01.jpg?sign=1738887568-WSiymLIOXmWXrMs2UGseRNGPpE7AcVTy-0-562eabc1adf1401708e1d3d96dd29ebd)
◎Optional.of(参数):包含非null值的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_02.jpg?sign=1738887568-PigSomtPFhyrF0nOnrzecKOXxJuczN3l-0-d7da344243260cee5c277e3af325cbc2)
◎Optional.ofNullable(参数):包含null值的Optional。若参数不为null,则返回包含参数的Optional;若参数为null,则返回空的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_03.jpg?sign=1738887568-FIRwwQ2oR1frjsvDjeHk7zjQgCJ06DNa-0-2a6ec718f36db12a4b760a27737637ea)
2.6.2 Optional的用法
(1)检查值是否存在或为空:存在检查使用isPresent;为空检查使用isEmpty。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_04.jpg?sign=1738887568-23Ex0EYd2JZ8kMgc0En4EA2xtgArFWcT-0-d9deb785d3fd4ebc4a385e25eb797354)
a.因为nullableOptional1包含字符串wyf,所以检查是否存在的结果是true。
b.因为nullableOptional2是一个空的Optional,所以检查是否为空的结果是true。
(2)条件运算:ifPresent,在满足数据存在的条件下,可执行自己处理语句。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_05.jpg?sign=1738887568-9NZPXGcMMcPT00BC0YXhJjAwhHdtvDfT-0-4b306d34787c7850fddbccd3efa170d0)
a.符合条件,输出字符串;
b.不符合条件,没有输出。
(3)默认值:设置当Optional为空时的默认值;orElseGet的参数是一个Supplier函数接口,它不指定默认值,而是使用函数接口实现算提供的值。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_06.jpg?sign=1738887568-bKM7CRoXQXccnOgYBC8ZKqrpetDiGEej-0-b0bce6c1457afe6166f2ba3214026988)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_01.jpg?sign=1738887568-JZ6gcCEqScQPBidEO3PiTrTmY4ntg7O3-0-05c6e41ddf58feb1b252bcc3bb5f9aa4)
a.nullableOptional1不为空,所以name1依然是wyf,不需要使用orElse设置的默认值www。
b.nullableOptional2为空,所以name2使用的是orElse设置的默认值www。
c.nullableOptional1不为空,所以name3依然是wyf,不需要使用orElseGet中Lambda表达值返回的wwwFromOrElseGet。
d.nullableOptional2为空,所以 name2使用的是 orElseGet中Lambda表达值返回的wwwFromOrElseGet。
(4)获得值:只有当Optional不为null时get方法才能获得包含的数据。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_02.jpg?sign=1738887568-DNaHXVPSOD4iHcgAR7ZCQqvwQoXfrx74-0-446d20aa167d622638daf783adbf974f)
(5)数据过滤:可以使用filter方法对数据进行过滤。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_03.jpg?sign=1738887568-UIaxaH9I9wPVBBh2UVKHmL5t0d7jpZDn-0-bda514b5b164e3ffe34179ab3903fd29)
通过filter方法看Optional中包含的数据是否符合name → name.equals("wyf")这个Predicate的实现,当前是符合的,所以运算的isWyf为true。
(6)转换处理:可以通过map和flatMap方法对数据进行转换处理。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_04.jpg?sign=1738887568-89WK9EKeMqX3g9pgjyZoPkLneIhaxEkN-0-e53c255442fa08f82fa9b8dca5bd3202)
将Optional中包含的数据wyf处理成为"Hello"+name,并获得这个值。