一、创建Optional对象
从下图中可以看出,Optional的方法并不多,所以看起来还是很简单的。
因为Optional类的两个构造函数都是私有的,所以不能通过new的方式来创建对象。但是在Optional类中提供了 of, ofNullable, empty 三个创建类的静态方法。
of
/**
* Returns an {@code Optional} with the specified present non-null value.
*
* @param <T> the class of the value
* @param value the value to be present, which must be non-null
* @return an {@code Optional} with the value present
* @throws NullPointerException if value is null
*/
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
值得注意的是 传入的value值不能为null,不然会抛出空指针异常。具体代码在Objects中的requireNonNull方法:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
empty
保存一个空的值,EMPTY就是new了一个空的Optional实例。
/**
* Returns an empty {@code Optional} instance. No value is present for this
* Optional.
*
* @apiNote Though it may be tempting to do so, avoid testing if an object
* is empty by comparing with {@code ==} against instances returned by
* {@code Option.empty()}. There is no guarantee that it is a singleton.
* Instead, use {@link #isPresent()}.
*
* @param <T> Type of the non-existent value
* @return an empty {@code Optional}
*/
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
ofNullable
相比于of方法,ofNullable()可以容忍value值为null。
/**
* Returns an {@code Optional} describing the specified value, if non-null,
* otherwise returns an empty {@code Optional}.
*
* @param <T> the class of the value
* @param value the possibly-null value to describe
* @return an {@code Optional} with a present value if the specified value
* is non-null, otherwise an empty {@code Optional}
*/
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
从代码中可以看出,当value值为null时,ofNullable()方法实际调用的方法时empty(),当value值不为空时,使用的是of方法。
所以当确定知道value值为null时,推荐使用empty()。当value值不为null时,推荐时用of()。当不确定value值是否为空时,就应该使用ofNullable(),以确保不会抛出异常。
二、方法
构造方法,equals,hashCode,toString就不说了。都是简单重写了一下,很容易就能懂,也没有啥好说的。先说一些常用的方法:
get
顾名思义,获取value的值。如果为null,会抛出空指针异常。
orElse
要求传入一个值,当value为null时,返回传入的默认值
orElseGet
同上,但是传入的是一个Supplier对象。使用lambda表达式就是()->{return value;},其中的Supplier返回的值就是用来替换null的默认值。
orElseThrow
同上,只不过当值为null时,会抛出传入的异常对象。注意:传入的对象任然是Supplier,但是Supplier返回的值是一个实例化的异常类。
ifPresent
当Optional的value不为空时,将把value作为Consumer的传入参数执行操作。
不同于Supplier,Consumer是必须要有入参,而Supplier必须要有出参,感兴趣可以看看Consumer,Supplier,function三个函数式接口。
map,filter,flatMap
map,同stream的map方法,链式处理传入一个function,输出一个Optional作为下一个开始。比如:
User user = new User();
Optional.of(user).map(User::getUsername).ifPresent(System.out::println);
filter,同stream的filter方法,如果Optional的value不符合条件,那么将返回一个value值为null的Optional对象。
flatMap,同map,返回的结果必须是Optional类。