![从企业级开发到云原生微服务: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=1739900732-MkELUj0Ll62kH5Vjo6kaxvHHll7Wsuau-0-9fd6dfb94bb53613a9e8469ffbcb7c3b)
◎Optional.of(参数):包含非null值的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_02.jpg?sign=1739900732-fR1Dt2rc9rfXQbbioMzPq5nHu4roVu9u-0-45d97e1d8a4005895289833e3fb1f990)
◎Optional.ofNullable(参数):包含null值的Optional。若参数不为null,则返回包含参数的Optional;若参数为null,则返回空的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_03.jpg?sign=1739900732-OXNEQ1i3U4oSYtLinZad4iShX7dwLi1j-0-19c4dce98925a67d828f9a9c112e646c)
2.6.2 Optional的用法
(1)检查值是否存在或为空:存在检查使用isPresent;为空检查使用isEmpty。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_04.jpg?sign=1739900732-eHbPNilwYSIqY80JyLtGj57tDAw1YBUE-0-5cb9beb2ae9f222f324a5094c9d49f32)
a.因为nullableOptional1包含字符串wyf,所以检查是否存在的结果是true。
b.因为nullableOptional2是一个空的Optional,所以检查是否为空的结果是true。
(2)条件运算:ifPresent,在满足数据存在的条件下,可执行自己处理语句。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_05.jpg?sign=1739900732-OlDmRWoKv7wXs37KC350fQAO9K6VZKy0-0-dd947e151e0e6a44bf0b0bbe86987bd9)
a.符合条件,输出字符串;
b.不符合条件,没有输出。
(3)默认值:设置当Optional为空时的默认值;orElseGet的参数是一个Supplier函数接口,它不指定默认值,而是使用函数接口实现算提供的值。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_06.jpg?sign=1739900732-eeEtAXhCwlnj9ddK2wUWRTCiZte2rRNr-0-25ff17c2f26f124ac00cc690872f42d6)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_01.jpg?sign=1739900732-zHLqS9YIS5GCQPjiT1l1YZFLf2RQzbHo-0-0df12264e50f3b8d64a8ccedb60ab708)
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=1739900732-bi2eKFMUfSsv7TeALKC1GDGQiaXh32Cl-0-528cb3f6c72ba40b40277b9306ad674c)
(5)数据过滤:可以使用filter方法对数据进行过滤。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_03.jpg?sign=1739900732-qNWTfdzJWTYbCPXQxLQIgpz3ewha8sVI-0-3f652a42365f5227198fa392077e28c3)
通过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=1739900732-NJ1uFxCzd6vSFzBEoJXR4lITm1qSX3Ih-0-e37a44103480fc9e01df593c0a888347)
将Optional中包含的数据wyf处理成为"Hello"+name,并获得这个值。