if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到想吃

,而且阅读起来比较困难,维护起来也比较困难,很容易出 Bug,如下图

怎么才让代码简单、高效、优雅起来。
1,提前 return,去除不必要的 else
优化前代码:
if (str.equals("java")) { // 业务代码 ! true;} else { return ;}
优化后代码:
if (str.equals("java")) { return ;}return false;
缺点:if else多的话,没什么大的效果
2,使用条件三目运算符
使用条件三目运算符可以简化某些 if-else,使代码更加简洁,更具有可读性。
优化前:
int price ;if(condition){ price = 80;}else{ price = 100;}
优化后:
int price = condition?80:100;
缺点:正对只有if 和esle这种两个选择的时候,还可以,但是多了的话,写三元表达式的话,理解起来就费力了,如下
int price = (condition>0) ? ((condition<10)? 8 : 11) : ((condition>-10)? -8 : -11) ;
3,使用 Map
使用 Map 数组,把相关的判断信息,定义为元素信息可以直接避免 if else 判断,实现代码如下。
优化前代码:
if (t == 1) { type = "name";} else if (t == 2) { type = "id";} else if (t == 3) { type = "mobile";}
我们先定义一个 Map 数组,把相关判断信息存储起来:
Map typeMap = new HashMap<>();typeMap.put(1, "name");typeMap.put(2, "id");typeMap.put(3, "mobile");
之前的判断语句可以使用以下一行代码代替了:
type = typeMap.get(ty);
4,使用枚举
JDK 1.5 中引入了新的类型——枚举(enum),我们使用它可以完成很多功能,例如下面这个。
优化前代码:
Integer typeId = 0;String type = "Name";if ("Name".equals(type)) { typeId = 1;} else if ("Age".equals(type)) { typeId = 2;} else if ("Address".equals(type)) { typeId = 3;}
优化时,我们先来定义一个枚举:
public enum TypeEnum { Name(1), Age(2), Address(3); public Integer typeId; TypeEnum(Integer typeId) { this.typeId = typeId; }}
有了枚举之后,以上 if-else 逻辑分支,可以优化为一行代码:
typeId = TypeEnum.valueOf("Name").typeId;
缺点:能力在此,暂无发现
5,合并条件表达式
在项目中有些逻辑判断是可以通过梳理和归纳,变更为更简单易懂的逻辑判断代码,如下所示。
优化前代码:
String city = "西安";String area = "029";String province = "陕西";if ("西安".equals(city)) { return "xi'an";}if ("029".equals(area)) { return "xi'an";}if ("陕西".equals(province)){ return "xi'an";}
优化后代码:
if ("西安".equals(city) || "029".equals(area) || "陕西".equals(province)){ return "xi'an";}
缺点:这种是对结果相同的做法合并,但是返回值不同,就傻了
6,使用 Optional
从 JDK 1.8 开始引入 Optional 类,在 JDK 9 时对 Optional 类进行了改进,增加了 ifPresentOrElse() 方法,我们可以借助它,来消除 if else 的判断,使用如下。
优化前代码:
String str = "java";if (str == null) { System.out.println("Null");} else { System.out.println(str);}
优化后代码:
Optional opt = Optional.of("java");opt.ifPresentOrElse(v -> System.out.println(v), () -> System.out.println("Null"));
缺点:对于大多使用JDK 1.8的公司来说,这个实现起来得改JDK版本,不切实际
7,策略模式+工厂方法消除 if else
假设需求为,根据不同勋章类型,处理相对应的勋章服务,优化前有以下代码:

首先,我们把每个条件逻辑代码块,抽象成一个公共的接口,可以得到以下代码:
//勋章接口public interface IMedalService { void showMedal();}
我们根据每个逻辑条件,定义相对应的策略实现类,可得以下代码:

接下来,我们再定义策略工厂类,用来管理这些勋章实现策略类,如下:

使用了策略+工厂模式之后,代码变得简洁多了,如下:

缺点:要多写较多代码,而且要新建类等
8,选择性的使用 switch
很多人都搞不懂 switch 和 if else 的使用场景,但在两者都能使用的情况下,可以尽量使用 switch,因为 switch 在常量分支选择时,switch 性能会比 if else 高。
if else 判断代码:
if (cmd.equals("add")) { result = n1 + n2;} else if (cmd.equals("subtract")) { result = n1 - n2;} else if (cmd.equals("multiply")) { result = n1 * n2;} else if (cmd.equals("divide")) { result = n1 / n2;} else if (cmd.equals("modulo")) { result = n1 % n2;}
switch 代码:
switch (cmd) { case "add": result = n1 + n2; break; case "subtract": result = n1 - n2; break; case "multiply": result = n1 * n2; break; case "divide": result = n1 / n2; break; case "modulo": result = n1 % n2; break;}
在 Java 14 可使用 switch 代码块,实现代码如下:
// java 14switch (cmd) { case "add" -> { result = n1 + n2; } case "subtract" -> { result = n1 - n2; } case "multiply" -> { result = n1 * n2; } case "divide" -> { result = n1 / n2; } case "modulo" -> { result = n1 % n2; }}
缺点:同级判断情况多,看起来不优雅,而且纵深拉扯很长
总结:使用枚举来清楚if else是比较合理,不过也需要因项目而定,抛砖引玉希望可以帮助和启发到你。