【JAVA】优化if else的几种方式

        在代码编写初期,我们写出来的代码,脉络清晰,结构简单。可随着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严重降低可读性与可维护性,所以在一开始,就要依据实际情况,灵活地选择处理方式。
 

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,多重if else if语句可以通过以下几种方式进行优化: 1.使用switch语句代替多重if else if语句。switch语句可以根据一个表达式的值,跳转到匹配的case语句执行,从而提高程序的执行效率。但是,switch语句只能用于判断整型、字符型和枚举类型的值,不能用于判断浮点型、布尔型和字符串类型的值。 2.将最可能出现的情况放在前面。在多重if else if语句中,如果某个条件的出现概率比其他条件高,那么就应该将这个条件放在前面,这样可以减少程序的判断次数,提高效率。 3.使用布尔变量代替多重if else if语句。如果多重if else if语句中的条件比较复杂,可以将每个条件的结果保存在一个布尔变量中,然后使用一个if语句判断这些布尔变量的值,从而简化程序的结构,提高可读性。 4.使用多态代替多重if else if语句。如果多重if else if语句中的条件是对象的类型,可以使用多态来代替这些条件,从而提高程序的可扩展性和可维护性。 以下是一个使用switch语句代替多重if else if语句的例子: ```java int day = 3; String dayName; switch (day) { case 1: dayName = "Monday"; break; case 2: dayName = "Tuesday"; break; case 3: dayName = "Wednesday"; break; case 4: dayName = "Thursday"; break; case 5: dayName = "Friday"; break; case 6: dayName = "Saturday"; break; case 7: dayName = "Sunday"; break; default: dayName = "Invalid day"; break; } System.out.println(dayName); // 输出:Wednesday ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值