回答

收藏

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

运营学院 运营学院 227 人阅读 | 0 人回复 | 2021-04-21



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

来源:

https://www.toutiao.com/i6821446290799329795/

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com



来都来了,走啥走,留个言呗~



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则