书籍《Java实战第二版》
文章目录
1. 为什么Optional取代null?
- 令人厌烦的NullPointerException异常
- 每为方法做一次null检查就会增加一个退出语句
- 每为方法做一次null检查就可能会造成多层嵌套,引起代码膨胀
- null无意义,null并不属于任何类型,这意味着它可以被赋值给任意引用类型的变量。
2. Java8引入的Optional<\T>
如何使用Optional代替null?
如果变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个“空”的Optional对象,由方法Optional.empty()返回。
Optional.empty()方法是一个静态工厂方法,它返回Optional类的特定单一实例。
如果你尝试解引用一个null,那么一定会触发NullPointerException,不过使用Optional.empty()就完全没事儿,它是Optional类的一个有效对象,多种场景都能调用,非常有用。
类似以下的一种包装的形式。
3. 使用方法
3.1 声明一个空的Optional
通过Optional的静态工厂方法:
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
//声明一个空的Optional
Optional<A> optA = Optional.empty();
3.2 依据值创建一个Optional
//依据值创建一个Optional
A a = new A();
//如果a是null,那么立即就会抛出一个空指针异常
Optional<A> optionalA = Optional.of(a);
3.3 可接受空指针的Optional
//可接受空指针的Optional
Optional<A> optional = Optional.ofNullable(a);
3.4 其他api
get()是这些方法中最简单但又最不安全的方法。如果变量存在,那它直接返回封装的变量值,否则就抛出一个NoSuchElementException异常。所以,除非你非常确定Optional变量一定包含值,否则使用这个方法是个相当糟糕的主意。
4. 关键概念
- null引用在历史上被引入到程序设计语言中,目的是为了表示变量值的缺失。
- Java 8中引入了一个新的类java.util.Optional,对存在或缺失的变量值进行建模。
- 你可以使用静态工厂方法Optional.empty、Optional.of以及Optional.ofNullable创建Optional对象。
- Optional类支持多种方法,比如map、flatMap、filter,它们在概念上与Stream类中对应的方法十分相似。
- 使用Optional会迫使你更积极地解引用Optional对象,以应对变量值缺失的问题,最终,你能更有效地防止代码中出现不期而至的空指针异常。
- 使用Optional能帮助你设计更好的API,用户只需要阅读方法签名,就能了解该方法是否接受一个Optional类型的值。