美文网首页
避免繁琐的Null校验

避免繁琐的Null校验

作者: _吱吱呀呀 | 来源:发表于2018-04-24 20:13 被阅读0次

    在代码中的很多地方进行非空判断,尤其是在对象调用方法中,如下:

      Object obj = function();
      if(obj != null){
        List<String> list = obj.getInnerList();
         if(list != null){
             String s =  list.get(1);
                 if(s != null && StringUtils.isNotBlank(s)){
                        .....
                  }
          }
      }
    

    判断相当繁琐,而且代码不美观
    在JDK8中新增了Optional类,Optional是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样就不用显式进行空值检测。

    of()ofNullable()是Optional的工厂方法,区别在与of(Object)参数不能为空,会抛出NullPointException异常,而ofNullable(Object)没有限制。

    Optional<Object> opt = Optional.of(Object); //参数不能为null
    Optional<Object> opt = Optional.ofNullable(Object); //任意参数
    boolean isNull = optional.isPresent();//判断值是否为空
    opt.ifPresent(Consumer consumer);//如果option对象保存值不是null,则调用consumer对象,否则不调用
    opt.orElse(value);//如果optional对象保存的值不是null,则返回原来的值,否则返回value
    opt.orElseGet(Supplier supplier);//功能与orElse一样,只不过orElseGet参数是一个对象
    opt.filter(Predicate);//判断Optional对象中保存的值是否满足Predicate,并返回新的Optional。
    opt.map(Function):对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
    flatMap():功能与map()相似,差别在于map方法的mapping函数返回值可以是任何类型T,而flatMap方法必须是Optional。

    Demo

      class Country{
          City city;
          City getCity(){
              return city;
          }   
          ... 
       }
      class City{
          Town town;
          City getTown (){
              return town;
          }   
          ... 
      }
      class Town {
          String townName = "new york";
          City getName (){
              return townName ;
          } 
          ...   
      }
    

    如果要获取townName,按照传统写法应该进行多次判断规避空指针异常:

    Country country = new Country();
    if(country != null && country.getCity() != null && country.getCity().getTown != null){
          System.out.println(country.getCity().getTown.getName());
    }
    

    如果用Optional就可以摆脱这些null检查

    Optional.of(new Country ())
          .map(Country ::getCity)
          .map(City::getTown)
          .map(Town::getName)
          .ifPresent(System.out::println);
    

    如果有空指针情况,异常将会被捕获,并返回Optional.empty();

    相关文章

      网友评论

          本文标题:避免繁琐的Null校验

          本文链接:https://www.haomeiwen.com/subject/kyeukftx.html