在代码编写初期,我们写出来的代码,脉络清晰,结构简单。可随着bug或者新需求的出现,状态变得越来越多,只能不停地加else来区分,久而久之,判断的次数越来越多,嵌套的层数也越来越深,变得难以维护。
下面看看哪些方法能优化if-else呢?
第一种方法:提前return,减少else判断
优化前:
private int handlePre1(boolean flag) {
if (flag) {
//do something
} else {
//do something
return -1;
}
return 0;
}
优化后:
private int handleAfter1(boolean flag) {
if (!flag) {
//do something
return -1;
}
//do something
return 0;
}
这个做法,将可以return的状态提到if中,直接干掉了else!
第二种方法:使用三目运算符
优化前:
private int handlePre2(boolean flag) {
if (flag) {
return 0;
} else {
return 1;
}
}
优化后:
private int handleAfter2(boolean flag) {
return flag ? 0 : 1;
}
这种方式局限性比较大,但对于那些依据状态直接返回某个值的情况非常适用,优化后代码非常简洁。如果三目运算符中还嵌套一层三目运算符,建议就不要使用这种方式了。
第三种方法:使用Optional
我们在代码中,经常需要判断某个对象是否为null,不为null后才会进行接下来的操作,好在java8为我们提供了Optional类。
优化前:
User user = new User();
int age = 20;
if (user != null) {
age = user.getAge();
}
优化后:
User user = new User();
Optional<User> optionalUser = Optional.ofNullable(user);
Integer age = optionalUser.map(User::getAge).orElse(20);
Optional让非空校验更加有优雅,代码层面减少了if判断,其实Optional在底层为我们封装好了if null判断而已。
第四种方法:使用switch case
优化前:
private String getCn(String en) {
String cn;
if ("student".equals(en)) {
cn = "学生";
} else if ("teacher".equals(en)) {
cn = "教师";
} else {
cn = "未知";
}
return cn;
}
同样,我们可以借鉴方式一提前return,来代替else
private String getCnByEarlyReturn(String en) {
if ("student".equals(en)) {
return "学生";
}
if ("teacher".equals(en)) {
return "教师";
}
return "未知";
}
如果这里面的情况很多,我们可能依然要判断多次,那我们用switch改写。
优化后:
private String getCnBySwitch(String en) {
switch (en) {
case "student":
return "学生";
case "teacher":
return "教师";
default:
return "未知";
}
}
如果单从效率来看,之前的时间复杂度为O(n),switch的复杂度为O(1),本质上swicth是通过比对String的哈希码来实现的。
第五种方法:使用枚举
如果上一例中的student、teacher是常量的话,最好是定义在枚举里。
public enum CnEnum {
STUDENT("student", "学生"),
TEACHER("teacher", "教师"),
UNKNOWN("unKnown", "未知");private String en;
private String cn;public String getEn() {
return en;
}public String getCn() {
return cn;
}CnEnum(String en, String cn) {
this.en = en;
this.cn = cn;
}static String of(String en) {
for (CnEnum temp : CnEnum.values()) {
if (temp.getEn().equals(en)) {
return temp.getCn();
}
}
return CnEnum.valueOf("UNKNOWN").getCn();
}
}
最后这样调用即可:
String cn = CnEnum.of("student");
总结
常见的优化方式,个人觉得有这些,过多的if else严重降低可读性与可维护性,所以在一开始,就要依据实际情况,灵活地选择处理方式。