zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    css下背景渐变与底部固定的蓝天白云
    indy10中idtcpclient的使用问题[和大华电子称数据交换]
    cliendataset中自增长字段的处理
    和大华电子称进行对数据通讯
    cxgrid主从表的困惑
    基于xml基类的web查询
    关于屏幕文件
    基于xml文件查询的xml文件之生成篇
    关于400改程序
    Tapestry Spring Hibernate整合工作小结[摘]
  • 原文地址:https://www.cnblogs.com/wk-missQ1/p/15217741.html
Copyright © 2011-2022 走看看