JAVA高级——Optional
-
- 二、为何要避免null指针
- 三、使用Optional优化null判断
-
-
- 3.1.1 使用Optional优化Car类
- 3.1.2 Optional的几种模式
- 3.1.3 使用map从Optional中提取值
- 3.1.4 使用flatMap链接Optional对象
-
- 3.1.4.1 使用Optional获取car的保险公司名称
- 3.1.4.2 使用Optional解引用串接的Person/Car/Insurance对象
- 3.1.5 操作由Optional对象构成的Stream流
- 3.1.6 默认行为及解引用Optional对象
- 3.1.7 两个Optional对象的组合
- 3.1.8 使用Filter进行剔除
-
一、概述
1、null引用引发的问题,以及为什么要避免null引用
2、从null到Optional:以null安全的方式重写你的域模型
3、让Optional发光发热: 去除代码中对null的检查
4、读取Optional中可能值的几种方法
5、对可能缺失值的再思考
二、为何要避免null指针
其实根据有关资料显示,每个一程序的设计者们都会为 NullOpint
而苦恼,而且有大部分的运行调试的问题都会在 空指针
上面,所以接下来这篇文章就告诉大家如何去使用 Optional
避免空指针;
代码一:
public class Person { private Car car; public Car getCar() { return car; } } public class Car { private Insurance insurance; public Insurance getInsurance() { return insurance; } } public class Insurance { private String name; public String getName() { return name; } }
那么接下来这个代码有什么问题呢?
public String getCarInsuranceName(Person person) { return person.getCar().getInsurance().getName(); }
其实如果其中一个出现了空,那么这个代码就会报错,程序不能正常进行运行;
2.1 使用if-else
所以我们可以将代码改为: 防御的方式进行避免空指针
第一种方式:
public String getCarInsuranceName(Person person) { if (person != null) { (以下5行)每个null检查都会增加调用链上剩余代码的嵌套层数 Car car = person.getCar(); if (car != null) { Insurance insurance = car.getInsurance(); if (insurance != null) { return insurance.getName(); } } } return "Unknown"; }
防御模式二: 采用每个退出节点都进行判断
public String getCarInsuranceName(Person person) { if (person == null) { (以下9行)每个null检查都会添加新的退出点 return "Unknown"; } Car car = person.getCar(); if (car == null) { return "Unknown"; } Insurance insurance = car.getInsurance(); if (insurance == null) { return "Unknown"; } return insurance.getName(); }
经过上述 if else
的一顿操作,是不感觉代码非的不美观,庆幸java提供一个判断为空的类,那个就是Optional。接下来我们会说明如何正确的使用Optional类。
三、使用Optional优化null判断
3.1 Optional 入门
这里 Optional
就像是一个容器,里面放一个泛型,
- 如果泛型对象为空,那么这个
Optional<T>
就是null
; - 否者,可以调用
Optional
中的方法进行操作里面的对象
元素;(接下里会具体介绍Optional
中的方法)
变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个“空”的Optional对象,由方法Optional.empty()返回。Optional.empty()方法是一个静态工厂方法,它返回Optional类的特定单一实例。
你可能还有疑惑,null引用和Optional.empty()有什么本质的区别吗?
从语义上讲,你可以把它们当作一回事儿,但是实际中它们之间的差别非常大:如果你尝试解引用一个null,那么一定会触发NullPointerEx