if-else的优化,你知道吗

如果if-else的分支较多,阅读起来比较困难,维护起来也容易出错,此时需要进行优化。下面提供几种方式,仅供参考

1.提前return,去除不必要的else

如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。

优化前:

if(condition){
    //doSomething
}else{
    return;
}

优化后:

if(!condition){
    return;
}
//doSomething

2.使用条件三目运算符

对于简单的if-else语句,可以直接使用条件三目运算符,使代码更加简洁,更具有可读性。

优化前:

int  price ;
if(condition){
    price = 80;
}else{
    price = 100;
}

优化后:

int price = condition? 80 : 100;

如果有一系列条件返回一样的结果,就不能使用三元表达式了,但可以将它们合并为一个条件表达。

3.使用 Optional

有时候if-else是因为非空判断导致的,这时可以使用Optional

优化前:

User user = new User();
if (user != null) {
    System.out.println("我不是null");
} else {
    System.out.println("我是null");
}

优化后:

User user = new User();
Optional.ofNullable(user).filter(u -> {
    System.out.println("我不是null");
    return true;
}).orElseGet(()->{
    System.out.println("我是null");
    return null;
});

4.表驱动法

主要作用是使你可以在表中查找信息,而不必用很多的逻辑语句(if或case)才能把它们找出来。听着是不是很懵逼,那就看看下面的案例

    public static void main(String[] args) {
        testAction(2, "sss");
    }


    //根据传入的type不同的方法,实现不同的功能
    public static String testAction(Integer type, Object data) {
        String rs = null;
        if (type == 1) {
            rs = eat(data);
        } else if (type == 2) {
            rs = fly(data);
        } else if (type == 3) {
            rs = drink(data);
        }
        return rs;
    }

    public static String eat(Object data) {
        System.out.println("我是eat的方法");
        System.out.println(data);
        return "e";//若需要返回值,就返回,否则返回null即可
    }

    public static String fly(Object data) {
        System.out.println("我是fly的方法");
        System.out.println(data);
        return "f";
    }

    public static String drink(Object data) {
        System.out.println("我是drink的方法");
        System.out.println(data);
        return "d";
    }

其中方法testAction中包含了一系列的if-else语句去调用不同的方法,那么可以使用函数式接口进行优化:

    public static String testNew(Integer type, Object data) {
        //定义一个map,存储函数式接口,入参是Object类型,出参是String类型
        Map<Integer, Function<Object, String>> map = new HashMap<>();
        map.put(1, (t) -> eat(t));
        map.put(2, (t) -> fly(t));
        map.put(3, (t) -> drink(t));

        String rs = null;
        //进行逻辑判断,需要对key进行判断,否则传入的类型不存在会出现空指针异常
        if (map.containsKey(type)) {
            rs = map.get(type).apply(data);
        }
        return rs;
    }

这种方式不仅代码简洁,而且可读性比较高。

posted @ 2023-05-09 09:10  钟小嘿  阅读(188)  评论(0编辑  收藏  举报