Optional使用(终于明白版)

一:简介

  1. 以前一直不懂Optional有啥用,感觉太无语了,Java8还把它当做一个噱头来宣传,最近终于发现它的用处了,当然不用函数式编程的话,是没感觉的;
  2. 举例:一个非洲的Zoo,提供add一个animal进来的功能,可是有可能是用Future来捕捉动物的,也就是说可能没有catch到animal,但是为了防止以后使用的时候,有NPE错误,只有做判断;
  3. 个人觉得Optional实现的功能,有很多替代方案,if-else、三目等都可以;但Optional是用于函数式的一个整体中的一环,让函数式更流畅
  • a)不使用Optional的版本,提变量,判空,必不可少,很繁琐
List<Animal> zoo = new ArrayList
Animal animal = manCatch();
    if(animal != null){
        zoo.add(animal);
    }<>();
  • b) 使用Optional 和函数式编程,一行搞定,而且像说话一样
List<Animal> zoo = new ArrayList<>();
    manCatch().ifPresent(zoo::add);

二:Optional方法介绍(篇幅原因,把实现隐藏)

  1. 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) ;
}
  1. 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));
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值