一:简介
- 以前一直不懂Optional有啥用,感觉太无语了,Java8还把它当做一个噱头来宣传,最近终于发现它的用处了,当然不用函数式编程的话,是没感觉的;
- 举例:一个非洲的Zoo,提供add一个animal进来的功能,可是有可能是用Future来捕捉动物的,也就是说可能没有catch到animal,但是为了防止以后使用的时候,有NPE错误,只有做判断;
- 个人觉得Optional实现的功能,有很多替代方案,if-else、三目等都可以;但Optional是用于函数式的一个整体中的一环,让函数式更流畅
List<Animal> zoo = new ArrayList<>();
Animal animal = manCatch();
if(animal != null){
zoo.add(animal);
}
List<Animal> zoo = new ArrayList<>();
manCatch().ifPresent(zoo::add);
二:Optional方法介绍(篇幅原因,把实现隐藏)
- Optional绝不仅仅是Null的一层封装而已,它提供了
public final class Optional<T> {
//Null指针的封装
private static final java.util.Optional<?> EMPTY = new java.util.Optional<>();
//内部包含的值对象
private final T value;
private Optional() ;
//返回EMPTY对象
public static<T> java.util.Optional<T> empty() ;
//构造函数,但是value为null,会报NPE
private Optional(T value);
//静态工厂方法,但是value为null,会报NPE
public static <T> java.util.Optional<T> of(T value);
//静态工厂方法,value可以为null
public static <T> java.util.Optional<T> ofNullable(T value) ;
//获取value,但是value为null,会报NoSuchElementException
public T get() ;
//返回value是否为null
public boolean isPresent();
//如果value不为null,则执行consumer式的函数,为null不做事
public void ifPresent(Consumer<? super T> consumer) ;
//过滤,如果value不为null,则根据条件过滤,为null不做事
public java.util.Optional<T> filter(Predicate<? super T> predicate) ;
//转换,在其外面封装Optional,如果value不为null,则map转换,为null不做事
public<U> java.util.Optional<U> map(Function<? super T, ? extends U> mapper);
//转换,如果value不为null,则map转换,为null不做事
public<U> java.util.Optional<U> flatMap(Function<? super T, java.util.Optional<U>> mapper) ;
//value为null时,默认提供other值
public T orElse(T other);
//value为null时,默认提供other值
public T orElseGet(Supplier<? extends T> other);
//value为null时,默认提供other值
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) ;
}
- map和flatMap方法
Optional的map和flatMap方法,封装了判空的逻辑,所以可以直接使用,流式,很方便
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}