if-else“烦不烦”,让代码简单、高效、优雅起来

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

if-else“烦不烦”,让代码简单、高效、优雅起来

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

if-else“烦不烦”,让代码简单、高效、优雅起来

怎么才让代码简单、高效、优雅起来。

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;

或者

typeId=TypeEnum.Name.getTypeId();

缺点:能力在此,暂无发现

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

假设需求为,根据不同勋章类型,处理相对应的勋章服务,优化前有以下代码:

if-else“烦不烦”,让代码简单、高效、优雅起来

首先,我们把每个条件逻辑代码块,抽象成一个公共的接口,可以得到以下代码:

//勋章接口

public interface IMedalService {

void showMedal();

}

我们根据每个逻辑条件,定义相对应的策略实现类,可得以下代码:

if-else“烦不烦”,让代码简单、高效、优雅起来

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

if-else“烦不烦”,让代码简单、高效、优雅起来

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

if-else“烦不烦”,让代码简单、高效、优雅起来

缺点:要多写较多代码,而且要新建类等

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 14

switch (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是比较合理,不过也需要因项目而定,抛砖引玉希望可以帮助和启发到你。

是否有用 单选

0

0%

0

0%


文章部分参考:作者:老王 来源:Java中文社区

作者:捡田螺的小男孩 来源:https://mp.weixin.qq.com/s/A065lNeBLE0ZDGWFFvP_wg


分享到:


相關文章: