避免繁琐的Null校验

2018-04-24  本文已影响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();

上一篇下一篇

猜你喜欢

热点阅读