Optional的定义
用来存储对象并解决NPE的包装类。
属性
private final T value;
Optional 对象中包装着一个泛型方法的对象, 当我们在包装类中存放着对应的方法的时候, 我们可以检验这个值是否存在,并且在适当的时候取出这个值来。
产生对象的两种方法
public static <T> Optional<T> of(T value);
public static <T> Optional<T> ofNullable(T value);
of 方法提供一个构造方法, 会将传入的对象引入 Optional 类的构造方法中, 默认构造方法会在调用时检查对象是否为 null , 如果为空的话,将会抛出一个空指针异常。
ofNullable 方法在调用构造器之前会提供一个事前检查,如果传入的对象为空的话,则会自动返回一个空的 Optional 对象,如果传入对象不为空的话,则 返回一个包含着该对象的包装类 。
检查对象
public boolean isPresent();
public void ifPresent(Consumer<? super T> consumer);
sPresent 方法返回对象是否存在,如果存在则返回 true 否则返回 false。
ifPresent 方法传入一个消费函数, 当对应的值存在的时候, 则去执行对应的消费函数内容。
获取对象
public T get();
public T orElse(T other);
public T orElseGet(Supplier<? extends T> other);
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X;
get 方法将会检查包装类的值,如果为空的话则抛出一个 NoSuchElementException 异常。不为空的话就返回对应的对象内容。
orElse 方法和 get 方法一样,会检查内容是否存在并且返回对象,但是有所不同的内容是, 当内容为空的时候将会返回默认的 other 的对象。
orElseGet 方法传入一个生产函数,和 orElse 方法类似,当对象内容为空的时候会自动的调用生产函数的内容,并且将函数生成的对象返回给方法。
orElseThrow 方法传入一个生产一个继承自 Throwable 的生产函数, 当对象内容为空的时候调用生产函数的方法, 并且将生产出来的 Throwable 对象抛。
示例代码:
**
* 测试optional
*
* @author wangmaoyu
* @create 2018-03-11 下午10:55
**/
public class TestOptional {
public static void main(String[] args) {
String str=null;
Optional optional=Optional.of("hello");
System.out.println(Optional.ofNullable(str).orElse("字符串为空"));
System.out.println(Optional.ofNullable(str).orElseGet(()->"默认值为空"));
optional.ifPresent(System.out::println);
System.out.println(optional.get());
}
}
效果: