是目前Java 程序开发中最典型的异常,它让你的代码充斥着深度嵌套的null 检查,代码的可读性糟糕透顶。
null 自身没有任何的语义,尤其是,它代表的是在静态类型语言中以一种错误的方式对缺失变量值的建模。
Java 一直试图避免让程序员意识到指针的存在,唯一的例外是:null 指针。
null 并不属于任何类型,这意味着它可以被赋值给任意引用类型的变量。这会导致问题,原因是当这个变量被传递到系统中的另一个部分后,你将无法获知这个null 变量最初的赋值到底是什么类型。
Java 8 中引入了一个新的类java.util.Optional<T>。这是一个封装Optional 值的类。
变量存在时,Optional 类只是对类简单封装。变量不存在时,缺失的值会被建模成一个“空”的Optional 对象,由方法Optional.empty()返回。
Optional.empty()方法是一个静态工厂方法,它返回Optional 类的特定单一实例。
1. 声明一个空的Optional
正如前文所述,你可以通过静态工厂方法Optional.empty 创建一个空的Optional 对象:
Optional<Car> optCar = Optional.empty();
2. 依据一个非空值创建Optional
你还可以使用静态工厂方法Optional.of 依据一个非空值创建一个Optional 对象:
Optional<Car> optCar = Optional.of(car);
如果car 是一个null,这段代码就会立即抛出一个NullPointerException,而不是等到你试图访问car 的属性值时才返回一个错误。
3. 可接受null 的Optional
最后,使用静态工厂方法Optional.ofNullable,你可以创建一个允许null 值的Optional 对象:
Optional<Car> optCar = Optional.ofNullable(car);
如果car 是null,那么得到的Optional 对象就是个空对象。
Optional 类的方法方 法
方 法 描 述 empty 返回一个空的Optional 实例 filter 如果值存在并且满足提供的谓词,就返回包含该值的Optional 对象;否则返回一个空的Optional 对象 flatMap 如果值存在,就对该值执行提供的mapping 函数调用,返回一个Optional 类型的值,否则就返回一个空的Optional 对象 get 如果值存在,就将该值用Optional 封装返回,否则抛出一个NoSuchElement Exception异常 ifPresent 如果值存在,就执行使用该值的方法调用,否则什么也不做 ifPresentOrElse 如果值存在,就以值作为输入执行对应的方法调用,否则执行另一个不需任何输入的方法 isPresent 如果值存在就返回true,否则返回falsemap 如果值存在, 就对该值执行提供的mapping 函数调用of 将指定值用Optional 封装之后返回,如果该值为null,则抛出一个NullPointerException异常 ofNullable 将指定值用Optional 封装之后返回,如果该值为null,则返回一个空的Optional 对象
or 如果值存在,就返回同一个Optional 对象,否则返回由支持函数生成的另一个Optional 对象 orElse 如果有值则将其返回,否则返回一个默认值 orElseGet 如果有值则将其返回,否则返回一个由指定的Supplier 接口生成的值 orElseThrow 如果有值则将其返回,否则抛出一个由指定的Supplier 接口生成的异常 stream 如果有值,就返回包含该值的一个Stream,否则返回一个空的Stream
用Optional 封装可能为null 的值
Optional<Object> value = Optional.ofNullable(map.get("key"));
以下是本章中的关键概念。
? null 引用在历史上被引入到程序设计语言中,目的是为了表示变量值的缺失。
? Java 8 中引入了一个新的类java.util.Optional,对存在或缺失的变量值进行建模。
? 你可以使用静态工厂方法Optional.empty、Optional.of 以及Optional.ofNullable
创建Optional 对象。
? Optional 类支持多种方法,比如map、flatMap、filter,它们在概念上与Stream
类中对应的方法十分相似。
? 使用Optional 会迫使你更积极地解引用Optional 对象,以应对变量值缺失的问题,
最终,你能更有效地防止代码中出现不期而至的空指针异常。
? 使用Optional 能帮助你设计更好的API,用户只需要阅读方法签名,就能了解该方法
是否接受一个Optional 类型的值。
原文:https://www.cnblogs.com/superkuan/p/14942221.html