if-else优化实践总结

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在实际开发中我们经常会用到if-else的情况但是这样代码写太过冗余我们可以通过一些方式来避免总写if-else的代码

public String getDay(String day){
    if("Monday".equals(day)){
       return "今天上英语课";
    }else if("Tuesday".equals(day)){
       return "今天上语文课";
    }else if("Wednesday".equals(day)){
       return "今天上数学课";
    }else if("Thursday".equals(day)){
       return "今天上音乐课";
    }else if("Sunday".equals(day)){
       return "今天上编程课";
    }else{
       ......
    }
}

 

优化策略1三目运算符

如果是简单的判断赋值可以使用三门运算符

String id="";
if(flag){
    id="a";
}else{
    id="b";
}

利用三目运算符可以直接优化成一行代码

id=flag?"a":"b";

 

如果是简单的判断调用方法可以使用三门运算符

Set<String> set1=new HashSet<>();
Set<String> set2=new HashSet<>();

if(flag){
    set1.add(id);
}else{
    set2.add(id);
}    

 利用三目运算符可以直接优化成

Set<String> set1=new HashSet<>();
Set<String> set2=new HashSet<>();
(flag?set1:set2).add(id);

 

优化策略2使用Stream优化

Jdk1.8新特性Stream流有三个这样APIanyMatchallMatchnoneMatch各自的作用如下

  • anyMatch判断条件里任意一个满足条件则返回true

  • allMatch判断条件里所有都满足条件则返回true

  • noneMatch判断条件里所有都不满足条件则返回true;

在日常实际开发当中我们可能会看到过这样存在很多判断条件的代码

 if(StringUtils.isEmpty(str1) || StringUtils.isEmpty(str2) ||
    StringUtils.isEmpty(str3) || StringUtils.isEmpty(str4) ||
    StringUtils.isEmpty(str5) || StringUtils.isEmpty(str6)
   ){
 .....
}

 这时就可以考虑到使用stream流来优化优化后的代码如下

 if(Stream.of(str1, str2, str3, str4,str5,str6).anyMatch(s->StringUtils.isEmpty(s))){
 .....
 }

 当然这只是针对或条件的若是遇到与条件时同样可以用Stream来优化例如

if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2) &&
   StringUtils.isEmpty(str3) && StringUtils.isEmpty(str4) &&
   StringUtils.isEmpty(str5) && StringUtils.isEmpty(str6)
){
   .....
}

 使用Stream优化后

if(Stream.of(str1, str2, str3, str4,str5,str6).allMatch(s->StringUtils.isEmpty(s))){
  .....
}

还有一个判断任意都不为空的操作

StringUtils.isNoneEmpty(str1,str2,str3)

 

优化策略3使用Map优化

优化量比较多的面向过程的if-else语句还可以考虑使用Map来优化虽然在一定程度上创建一个额外map会占用内存但那丁点内存对于现阶段计算机而言可以说不足挂齿。

public String getDay(String day){
    if("Monday".equals(day)){
       return "今天上英语课";
    }else if("Tuesday".equals(day)){
       return "今天上语文课";
    }else if("Wednesday".equals(day)){
       return "今天上数学课";
    }else if("Thursday".equals(day)){
       return "今天上音乐课";
    }else if("Sunday".equals(day)){
       return "今天上编程课";
    }else{
       ......
    }
}

这时可以根据具体场景来考虑是否可以利用Map优化使用Map优化的方式是先在该类中定义一个static的map类似这样

public static final Map<String,String> dayMap=  ImmutableMap.<String, String>builder()
    .put("Monday","今天上英语课")
    .put("Tuesday","今天上语文课")
    .put("Wednesday","今天上数学课")
    .put("Thursday","今天上音乐课")
    .put("Sunday","今天上编程课")
    .build();

定义完后就直接在先前使用if-else的方法里进行这样优化

public String getDay(String day){
    return dayMap.get(day);
}

这样优化后业务方法里的判断获取值的处理是不是就清爽了很多当然这只是针对量比较多的if-else而言若是比较少的判断语句再额外定义一个map来搞隐约有画蛇添足的嫌疑。

细心的读者可能会发现 我在定义map的时候使用到了一个ImmutableMap的类这是Google Guava里的一个类可生成一个不可变的Map对象这就意味着初始化定义后后续就无法再put修改了它的这个特性可以保证线程的安全。一般用来替换if-else的map我们就是要求在初始化定义后就不会再允许修改了因此这个ImmutableMap生成的map可以很好地帮我们实现这一点。另外最重要一点是使用这个ImmutableMap可以实现链式编程就像上面定义的链式写法若是用传统的map定义就每次都要map.put()、map.put()地赋值。

优化策略4使用枚举优化

前面提到过可使用策略枚举来优化大批量的if-else当然若只是判断获不同条件来取值的代码可以考虑直接使用枚举来优化其效果与map的处理效果类似。

还是用前面判断课程的if-else为案例来优化。

首先先在类中定义一个枚举

public enum dayEnum {
    Monday("今天上英语课"),
    Tuesday("今天上语文课"),
    Wednesday("今天上数学课"),
    Thursday("今天上音乐课"),
    Sunday("今天上编程课");

    public String value;

    dayEnum(String value){
      this.value=value;
    }
}

定义完后就可以类似前面map的方式直接将判断值去枚举里获取然后直接返回获取到的值这样写法是不是也比较优雅了。

public String getDay(String day){
    return dayEnum.valueOf(day).value;
}

优化策略5使用Optional类优化

在实际工作中我曾经遇到类似这样的代码看起来像没什么问题但如果其中某个属性值不幸为null那么恭喜你你将会喜提一个NullPointerException异常。

String name=school.getGrades().getStuendt().getName();

若要处理这个可能出现的空指针异常传统写法可以写一堆if-else语句来处理就像这样子

String name=null;
if(school!=null){
    Grades grade=school.getGrades();
    if(grade!=null){
        Student student=grade.getStuendt();
        if(student!=null){
          name = student.getName();
        }
    }
}

在遇到这种层层嵌套的if-else判断时可以考虑使用jdk1.8新特性Optional 类来优化优化后的效果如下顿时又优雅了很多。

String name = Optional.ofNullable(school)
  .flatMap(School::getGrades)
  .flatMap(Grades::getStuendt)
  .map(Student::getName)
  .orElse(null);

优化策略6使用设计模式——策略模式+枚举

使用策略模式代替繁琐的if else_策略模式代替if else_lucky_ljw的博客-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6