![从企业级开发到云原生微服务: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=1739593153-mouDXgUCbYtpvWsGtvuLUjTEhhIDRBk4-0-5f930e1930013f984aecdc20cb79fbc8)
◎Optional.of(参数):包含非null值的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_02.jpg?sign=1739593153-HOfYF6kKOdgaDf6lbise3VYWBLYGIPqJ-0-846db804c97ba2867a5be4300a924802)
◎Optional.ofNullable(参数):包含null值的Optional。若参数不为null,则返回包含参数的Optional;若参数为null,则返回空的Optional。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_03.jpg?sign=1739593153-PH94rhkfIIxpFXjH2Z0jQGXQG9dKpwsl-0-e1f382ae00d7cca9a98cd3da5540c2f4)
2.6.2 Optional的用法
(1)检查值是否存在或为空:存在检查使用isPresent;为空检查使用isEmpty。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_04.jpg?sign=1739593153-NFvrtwIHBjuX65ip1TwjpT6YjqRkdzqc-0-392a66336a95b6f4ac03bbbb20ca5fa9)
a.因为nullableOptional1包含字符串wyf,所以检查是否存在的结果是true。
b.因为nullableOptional2是一个空的Optional,所以检查是否为空的结果是true。
(2)条件运算:ifPresent,在满足数据存在的条件下,可执行自己处理语句。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_05.jpg?sign=1739593153-JBT0tVzxo2SzD0k3i6jYLgltrqJLJqGT-0-dc66340c84059cd677db55fbf94a250b)
a.符合条件,输出字符串;
b.不符合条件,没有输出。
(3)默认值:设置当Optional为空时的默认值;orElseGet的参数是一个Supplier函数接口,它不指定默认值,而是使用函数接口实现算提供的值。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_43_06.jpg?sign=1739593153-sgLxHQwsdCV50PLD8WSbsXSHVFJKcJKl-0-d0dc8ac95fd9417399e75d867eff3d81)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_01.jpg?sign=1739593153-fZ0khDRjNbYIidZJLAF4rz8QrTQ5bRLa-0-18e04bb862c780a88fb651e43a66e08a)
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=1739593153-ETxtwcOv8ON5auYFwK719Ko7LB5i8og0-0-b78dd6c43da20dba806830b15712aac3)
(5)数据过滤:可以使用filter方法对数据进行过滤。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_44_03.jpg?sign=1739593153-Z2zrCCHiRNRHXcOosgpNqN4KIfVguX9Q-0-ec1aa5271340797b00d2b07c9ae586de)
通过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=1739593153-BtzzoS9pI7ecnMRRcA9BfhXgXfTk9vrO-0-d5e6b12eb654ba55f61713c4bedeea61)
将Optional中包含的数据wyf处理成为"Hello"+name,并获得这个值。