利用JDK8提供的Optional简化if else

程序猿日常开发中,为了避免NullPointerException异常,会写很多if else的判断。如果if else太多会让代码显的很乱,那如何减少if else的使用呢?


减少if else的方式之一,利用JDK8提供的Optional


ofNullable()、map()、orElseGet()的使用示例

示例中getStartTime()获取String类型的时间字符串并返回。执行逻辑:

  1. 调动selectStartTime()查询DB返回LocalDateTime值;
  2. 响应值dateTime如果为null,就给一个默认值;
  3. 响应值dateTime如果不为null,就把dateTime值转换成String类型的时间字符串并返回。

getStartTime()方法体用了5行代码。

private String getStartTime() {
    LocalDateTime dateTime = selectStartTime();
    if (dateTime == null) {
        return "2020-01-01 00:00:00";
    }
    return dateTimeToString(dateTime);
}

private LocalDateTime selectStartTime(){
   //去DB查找业务需要的LocalDateTime值
}

protected String dateTimeToString(LocalDateTime dateTime) {
    if (dateTime == null) {
        return null;
    }
    return DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT).format(dateTime);
}

接着我们利用JDK8提供的Optional类,把以上5行代码简化成下面的1行代码。

private String getStartTime() {
    return Optional.ofNullable(selectStartTime()).map(e->dateTimeToString(e)).orElseGet(()->"2020-01-01 00:00:00");
}

1行代码达到同样的效果。


ofNullable()、orElseGet()的使用示例

如果上面没看懂,那看一下这个简化版的示例:

User user = getCacheUser(1);
if (user == null) {
    user = selectUserById(1);
}

static class User {
     private String name;
     private Address address;

     //Get、Set方法
 }

 static class Address {
     private String area;
     private String province;
     private String city;

     //Get、Set方法
 }

接着我们利用JDK8提供的Optional类,把以上4行代码简化成下面的1行代码。

User user = Optional.ofNullable(getCacheUser(1)).orElseGet(() -> selectUserById(1));

注意:Optional的orElseGet()的参数是一个函数式接口,只有在条件为null时才会执行orElseGet()里的方法,这是跟orElse()最大的区别,用orElseGet()性能会更好。


ofNullable()、map()、orElseGet()的使用示例

public String getCity(User user)  throws Exception{
   if(user!=null){
       if(user.getAddress()!=null){
           Address address = user.getAddress();
           if(address.getCity()!=null){
               return address.getCity();
           }
       }
   }
   throw new Excpetion("对象为空"); 
}

接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。

public String getCity(User user) throws Exception{
    return Optional.ofNullable(user)
                   .map(u-> u.getAddress())
                   .map(a->a.getCity())
                   .orElseThrow(()->new Exception("对象为空"));
}

ofNullable()、ifPresent()的使用示例

if(user!=null){
    dosomething(user);
}

接着我们利用JDK8提供的Optional类,把以上3行代码简化成下面的1行代码。

 Optional.ofNullable(user).ifPresent(u->dosomething(u));

ofNullable()、map()、orElseGet()的使用示例

public User getUser(User user) throws Exception{
    if(user!=null){
        String name = user.getName();
        if("zhangsan".equals(name)){
            return user;
        }
    }else{
        user = new User();
        user.setName("zhangsan");
        return user;
    }
}

接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。

public User getUser(User user) {
    return Optional.ofNullable(user)
                   .filter(u->"zhangsan".equals(u.getName()))
                   .orElseGet(()-> {
                        return new User("zhangsan");
                   });
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值