JDK8使用Optional判null的技巧

1.Optional类的使用场景;

  个类对于大家来说,是一个非常重要的类,不知道大家有没有被 java.lang.NullPointerException 疯狂的折磨过,不管是新人开发还是老开发,遇到这个问题的时候,都是头大的很,因为我们要在代码里面去疯狂的判断是否是null,如果不是 null 需要怎么处理,如果是 null 需要怎么处理,反正就是你要是想解决 java.lang.NullPointerException 这个问题,就免不了去加一些判断条件,而 Optional 这个类,则是帮你优雅的处理 null 的问题。

我们先看一组 Java7 中的一些判断空的实现:

 User user = usersMapper.selectUserById(userId);
    if(user!= null){
        String userName = user.getUserName();
        if(userName != null && !userName.isEmpty()){
                .....
          }
    }    

我们再来对比一下 JDK8 中,给我们提供的方法来进行验证的方式。

User user = usersMapper.selectUserById(userId);
Optional.ofNullable(user)
        .map(User::getUserName)
        .ifPresent(userName->{
        ....
        }

大家看这种链式编程,ofNullable() 方法给我们提供了判断 user 是不是空,并且去校验 userName,如果存在,然后执行下面的逻辑,相比较 JDK7 的内容,相信大家看起来的话肯定是没有 JDK7 中的表现的那么的明显,但是大家看代码是不是发现已经被处理的妥妥的了。

对于 Optional 类,在 Java8 实战中给出了很多的方法:

  ofNullable 方法 :将指定值用Optional封装之后返回,如果该值为null,则返回一个空的Optional对象

  empty 方法 :返回一个空的Optional实例

  filter 方法 :如果值存在并且满足提供的谓词,就返回包含该值的Optional对象;否则返回一个空的 Optional对象

  flatMap 方法 :如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返 回一个空的Optional对象

  get 方法 :如果该值存在,将该值用Optional封装返回,否则抛出一个NoSuchElementException异常

  ifPresent 方法 :如果值存在,就执行使用该值的方法调用,否则什么也不做

  isPresent 方法 :如果值存在就返回true,否则返回false

  map 方法 :如果值存在,就对该值执行提供的mapping函数调用

  of 方法 :将指定值用Optional封装之后返回,如果该值为null,则抛出一个NullPointerException异常

  orElse 方法:如果有值则将其返回,否则返回一个默认值

  orElseGet 方法 :如果有值则将其返回,否则返回一个由指定的Supplier接口生成的值

  orElseThrow 方法 :如果有值则将其返回,否则抛出一个由指定的Supplier接口生成的异常

大家看这些方法是不是都有很多相似的,比如 map,flatMap,还有orElse,orElseGet,orElseThrow 方法

map 和 flatMap 比较:

  这两个都是做 转换值 的操作,区别就是入参的类型不是一样的,map的入参是 Function<? super T, ? extends U> mapper 而 flatMap 入参则是 Function<? super T, Optional<U> > mapper 。

  入参的不同也就导致了他们获取返回值也是不同的,map中获取的返回值自动被Optional包装,flatMap中返回值保持不变,但必须是Optional类型。

  源码里面的样子

map:

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));
        }
    }


flatMap:

 public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }

  map 方法参数中的函数 mapper 输出的是值,然后 map 方法会使用 Optional.ofNullable 将其包装为 Optional;而 flatMap 要求参数中的函数 mapper 输出的就是 Optional。

原文地址:https://www.cnblogs.com/wk-missQ1/p/15217741.html