历史
空指针异常是导致Java应用程序失败的最常见原因,为了解决此类问题, Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类成为JDK8的新特性。
是什么
Optional 类(java.util.Optional) 是一个容器类,它可以保存类型 T 的值,代表这个值存在。或者保存null,表示这个值不存在。原本我们使用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。可以有效的避免空指针异常。
主要作用
- 验证对象,避免繁琐的!=null代码而存在
- 使用函数式编程,解决验证对象如果为空怎么进行处理
使用流程
根据流程图,结合实际需求,使用容器中对外开放的方法
容器中的方法
创建
把指定的对象放到 Optional 容器中,返回一个 Optional 实例
Optional.of(object)
Optional<Object> optionalObject = Optional.of(object);
创建一个 Optional 实例,object 必须非空,如果是空抛出NPE(空指针)
Optional.ofNullable(object)
Optional<Object> optionalObject = Optional.ofNullable(object);
创建一个 Optional 实例,object 可以是 null,如果是null 会返回一个空的 Optional 实例
Optional.empty()
Optional<HelloEntity> empty = Optional.empty();
创建一个空的 Optional 实例
验证
optionalObject.isPresent()
boolean b = optionalObject.isPresent()
验证 Optional 容器实例内的对象是否存在
optionalObject.ifPresent()
optionalObject.ifPresent(op -> System.out.println("ifPresent: " + op));
如果容器内的对象有值,就执行 Consumer 接口的实现代码,并且该值会作为参数传给它
获取容器中的对象
optionalObject.get()
Object object = optionalObject.get()
如果容器内的对象有值,返回该值,否则抛异常(No value present)
optionalObject.orElse()
Object objectElse = optionalHelloNull.orElse(new Object()))
如果容器内的对象有值,则将其返回,否则返回指定的其它值(类型需要一致)
optionalObject.orElseGet()
Object objectElse = optionalHelloNull.orElseGet(() -> new Object()))
如果容器内的对象有值,则将其返回,否则返回指定的其它值(类型需要一致)
orElse 和 orElseGet 区别
当容器内对象为空时,orElse 和 orElseGet 区别不大,但当容器内对象有值时,orElse仍然会去调用方法创建对象,而orElseGet不会再调用方法;所以在我们处理的业务数据量大的时候,这两者的性能就有很大的差异;
过滤
optionalObject.filter()
Optional<Object> objectOptionalFilter = optionalObject.filter(obj -> Objects.nonNull(obj))
当容器内对象存在时,并且这个值匹配给定的 predicate,返回一个Optional实例,否则返回一个空的Optional
映射
optionalObject.map()
Optional<Object> objectOptionalMap = optionalObject.map(Object::getNnam);
获取容器内对象内部属性,如果不为空直接返回结果,否则返回一个空的 Optional 实例对象
optionalObject.flatMap()
Optional<Object> objectOptionalflatMap = optionalObject.flatMap(obj -> Optional.ofNullable(obj.getName()));
获取容器内对象内部属性,内部属性的调用必须使用Optional容器实例化