Optional概念


首先了解一下optional,这个是模仿scar语言的一个概念。java api中的解释是这样的

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.

大意如下:一个容器对象,它可能包含也可能不包含非空值。如果存在一个值,isPresent()将返回true, get()将返回值。

of()、empty()、ofNullable()


首先我们看下Optional这个类
Stream进阶之Optional

可以看到它的无参构造方法是private,而且内部直接创建了静态对象EMPTY
这个对象的value是一个类型为传进来的泛型,值为null的终态变量
也就是说Optional这个对象本身不为null,但是它实际上的value是null
Stream进阶之Optional

它的有参构造方法也是private,返回了一个value为Objects.requireNonNull(value)的对象。
那么Objects.requireNonNull(value)又是什么?
Stream进阶之Optional

看了源码,很明了,就是为null报空指针异常,不为null就返回对象本身

接下来关注的点是,既然构造方法被私有化了,那么一定有获取对象实例的方法。经过简单的查看,就是我们要阐述的三个方法。
empty()直接返回了一个EMPTY
Stream进阶之Optional

of()就是用了一个有参的常规构造方法,说得直白点,就是泛型对象不为null就是返回一个装了对象本身的容器对象,为null的话就报异常。这么一看好像包这一层毫无意义。
Stream进阶之Optional

ofNullable()的源码一看就懂,简单来说就是上述of()和empty()的结合,有效避免了传入对象为空报异常的问题,如果为空的话,就会返回一个EMPTY
Stream进阶之Optional

isPresent()、ifPresent(Consumer<? super T> consumer)


这两个方法都是判断Optional的实例对象是否为空对象。具体差异我们看源码
isPresent()
Stream进阶之Optional

很显然,isPresent()无需参数,直接返回true\false,所以,这个方法一般与get()一起使用来获取value,get()方法如下:
Stream进阶之Optional

ifPresent(Consumer<? super T> consumer)
Stream进阶之Optional

这个参数有点小复杂,主要是需要搞懂Consumer这个接口,这里不铺开讲,简单来理解,就是该方法的参数接收lambda表达式,且没有返回值

orElse(T other)、orElseGet(Supplier<? extends T> other)


这两个方法的作用都是返回一个默认值,即非空返回对象为空则返回入参
orElse(T other)
Stream进阶之Optional

orElseGet(Supplier<? extends T> other)
Stream进阶之Optional

区别就在于,如果value非空,那么orElse是仍然会执行入参的,而orElseGet则不会。
就比如,我们使用懒加载的方式,不直接传入一个实体对象,而是一个createDto()这样的类似构造方法的入参
那么,这两种方式的性能差异就出来了

相关文章: