![从企业级开发到云原生微服务: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=1739527777-mg3aqbwfkmyDxpfvDdeKUdaGQ9ZRjnCn-0-3cb5400cb77e23be9aa643d40d8467b9)
◎Optional.of(参数):包含非null值的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_02.jpg?sign=1739527777-vzy0XTNT6E8vim7v7ktJOBRCucA3TrmS-0-49538dc020faa799c0af24f279897b94)
◎Optional.ofNullable(参数):包含null值的Optional。若参数不为null,则返回包含参数的Optional;若参数为null,则返回空的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_03.jpg?sign=1739527777-CCpi10ItuMccjJE041bYGWM07LwpEWWh-0-33111bbc68092f919c4b1a6751fe996a)
2.6.2 Optional的用法
(1)检查值是否存在或为空:存在检查使用isPresent;为空检查使用isEmpty。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_04.jpg?sign=1739527777-xWYcduUsFwAuRevUf9qHUHvYiTDer6W7-0-7853655f50eada774b924f5ff93b8001)
a.因为nullableOptional1包含字符串wyf,所以检查是否存在的结果是true。
b.因为nullableOptional2是一个空的Optional,所以检查是否为空的结果是true。
(2)条件运算:ifPresent,在满足数据存在的条件下,可执行自己处理语句。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_05.jpg?sign=1739527777-XT9eZv8Nbp4RPWnkzEgwaxsNn8zAhw1n-0-3878f994f50615f612d097519cc679cf)
a.符合条件,输出字符串;
b.不符合条件,没有输出。
(3)默认值:设置当Optional为空时的默认值;orElseGet的参数是一个Supplier函数接口,它不指定默认值,而是使用函数接口实现算提供的值。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_06.jpg?sign=1739527777-uxK0mdoqtB9JOxS651ySY4YTASoCHmVu-0-9f037c301f4ea1a52ea82526fa660729)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_01.jpg?sign=1739527777-c069kCKovFrtFDqyGH5Oe4U8i52w2Wgy-0-5326149f5d3dac0f94e933d8fb92f295)
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=1739527777-h7vkv54xScEFssW43GCA1bkMCyB9aSz1-0-87c6b0345575f059de6db83317788e3d)
(5)数据过滤:可以使用filter方法对数据进行过滤。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_03.jpg?sign=1739527777-LJ0JhmNDrr1k2Qb7M7nxpQnaXnryCk69-0-acd72fb10296ef1a6abf92d70b349d34)
通过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=1739527777-WzNjv5iPIyho2l2SyK6xD839sqfQk5s7-0-6f12c0939d6fd60e516c7ccb2439563a)
将Optional中包含的数据wyf处理成为"Hello"+name,并获得这个值。