- 从企业级开发到云原生微服务:Spring Boot实战
- 汪云飞等
- 588字
- 2021-04-04 11:26:48
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=1739404250-oJSERAudZ8yadkhnftqCtm6989HVb22w-0-7865aa475c356b49dce27ff54b45ba75)
◎Optional.of(参数):包含非null值的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_02.jpg?sign=1739404250-jYyDxWhZuen5ros1aVKKu8VNyy5gfMoF-0-7c8fe511220a434282888bdcdd8319ac)
◎Optional.ofNullable(参数):包含null值的Optional。若参数不为null,则返回包含参数的Optional;若参数为null,则返回空的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_03.jpg?sign=1739404250-rVefxcM3arsonsHnKEimGOFm4btSVxqM-0-0971b10a7ca9e62d603a77118f0300c5)
2.6.2 Optional的用法
(1)检查值是否存在或为空:存在检查使用isPresent;为空检查使用isEmpty。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_04.jpg?sign=1739404250-YCzQt04osXdY3L38rs8IvzSwcfQfdiWn-0-196eb503ffb121b44829d084438ce4e9)
a.因为nullableOptional1包含字符串wyf,所以检查是否存在的结果是true。
b.因为nullableOptional2是一个空的Optional,所以检查是否为空的结果是true。
(2)条件运算:ifPresent,在满足数据存在的条件下,可执行自己处理语句。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_05.jpg?sign=1739404250-6W75jBDtvENmACrJpm8IhJ2TubGLd4zv-0-a1266d0525bcbfdc6812f9d81db8dd19)
a.符合条件,输出字符串;
b.不符合条件,没有输出。
(3)默认值:设置当Optional为空时的默认值;orElseGet的参数是一个Supplier函数接口,它不指定默认值,而是使用函数接口实现算提供的值。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_06.jpg?sign=1739404250-gTT6drM0bbgvMtgYUyWYYtv26d5ovoyF-0-3d408ed8aa1a18adea6b77cd906fe828)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_01.jpg?sign=1739404250-KdypWZ0yaCmhwPItqXW57NjyZN8roLT4-0-001f8dfd6e00a4b71d649d9fe14a6ca0)
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=1739404250-RzCcrcoPnbQ7Q5x3KDwLjZ9CmZL9PSvV-0-35eb8bc84e6536ae9f750964e9afc53c)
(5)数据过滤:可以使用filter方法对数据进行过滤。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_03.jpg?sign=1739404250-m1QkyhepVb46N4xUYGhN2eWYNvCg0uVL-0-5e328ef845a4d379e06326e8104e2c4d)
通过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=1739404250-SFBOYpka9eome6U4KxXGnh7zfBCKk2gk-0-594433a736d78c79b1b181a28489628d)
将Optional中包含的数据wyf处理成为"Hello"+name,并获得这个值。