三目运算符和if else哪个效率高_if-else“烦不烦”,让代码简单、高效、优雅起来...

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

6dd95b51b2b74e9f303eaab5fb2f9cf9.png

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

43f128f5e6a4b07189d6c4de85819c0b.png

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

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

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

10fee9669b5355909e28950df43c35da.png

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

//勋章接口public interface IMedalService {    void showMedal();}

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

943d5b4d69b89f721b81d6f2389f3f10.png

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

9bed106b53ffb6dba2aa0113610b0344.png

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

851b6fc76769d75c55d222df0fed964c.png

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

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


版权声明:本文为weixin_39733821原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。