前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >如何优化代码中大量的if/else

如何优化代码中大量的if/else

作者头像
訾博ZiBo
发布2025-01-06 18:09:43
发布2025-01-06 18:09:43
3000
代码可运行
举报
运行总次数:0
代码可运行

一、如何优化代码中大量的if/else

不是所有的if/else和switch/case都需要优化,当我们发现有“痛点”或者“闻到代码有坏味道”再来优化才是最好的,不然你可能会写了一个从不扩展的可扩展代码,所有的优化都是为了更好的迭代项目,更好的服务于业务,而不是为了优化而优化——深夜里的程序员

1、判断条件取反,提前return

代码语言:javascript
代码运行次数:0
复制
package com.zibo.ifelse;

// 判断条件取反,提前return
public class Method01 {
    public static void main(String[] args) {
        boolean good = true;
        // 原始写法
        System.out.println(doSth(good));
        // 优化写法:判断条件取反,提前return
        System.out.println(doSthNew(good));
    }

    // 原始写法
    private static String doSth(boolean good) {
        if (good) {
            // do something
            return "你是个好人!热烈欢迎!";
        } else {
            return null;
        }
    }

    // 优化写法:判断条件取反,提前return
    private static String doSthNew(boolean good) {
        if(!good){
            return null;
        }
        // do something
        return "你是个好人!热烈欢迎!";
    }
}

2、策略模式

代码语言:javascript
代码运行次数:0
复制
package com.zibo.ifelse;

import java.util.HashMap;
import java.util.Map;

// 策略模式
public class Method02 {
    public static void main(String[] args) {
        String strategy = "大哥";
        // 原始写法
        doSth(strategy);
        // 多态写法
        doSthNew1(strategy);
        // 枚举写法
        doSthNew2(strategy);
    }

    // 原始写法
    private static void doSth(String strategy) {
        if(strategy.equals("大哥")){
            System.out.println("大哥威猛!……");
        }else if(strategy.equals("二哥")){
            System.out.println("二哥豪爽!……");
        }else if(strategy.equals("三哥")){
            System.out.println("二哥帅气!……");
        }
    }

    // 多态写法
    private static void doSthNew1(String strategy){
        Map<String,Strategy> map = new HashMap<>();
        map.put("大哥",new A());
        map.put("二哥",new B());
        map.put("三哥",new C());
        Strategy s = map.get(strategy);
        s.run();
    }

    // 枚举写法
    private static void doSthNew2(String strategy){
        EStrategy.valueOf(strategy).run();
    }
}
// 多态写法
interface Strategy{
    void run();
}

class A implements Strategy{
    @Override
    public void run() {
        System.out.println("大哥威猛!……");
    }
}

class B implements Strategy{
    @Override
    public void run() {
        System.out.println("二哥豪爽!……");
    }
}

class C implements Strategy{
    @Override
    public void run() {
        System.out.println("二哥帅气!……");
    }
}

// 枚举写法
enum EStrategy{
    大哥 {
        @Override
        void run() {
            System.out.println("大哥威猛!……");
        }
    }, 二哥 {
        @Override
        void run() {
            System.out.println("二哥豪爽!……");
        }
    }, 三哥 {
        @Override
        void run() {
            System.out.println("二哥帅气!……");
        }
    };

    abstract void run();
}

3、使用Optional

代码语言:javascript
代码运行次数:0
复制
package com.zibo.ifelse;

import java.util.Optional;
import java.util.function.Function;

// 使用 Optional
public class Method03 {
    public static void main(String[] args) {
        String str = null;
        // 原始写法
        doSth(str);
        // 使用 Optional
        doSthNew(str);
    }

    // 原始写法
    private static void doSth(String str) {
        if(str == null){
            System.out.println("你在耍我!");
        }else {
            System.out.println("好的,大哥!");
        }
    }

    // 使用 Optional
    private static void doSthNew(String str) {
        Optional<String> userOptional = Optional.ofNullable(str);
        Function<String, String> function = string -> "好的,大哥!";
        System.out.println(userOptional.map(function).orElse("你在耍我!"));
    }
}

4、表驱动法

表驱动法:使用查询代替逻辑语句

代码语言:javascript
代码运行次数:0
复制
package com.zibo.ifelse;

// 表驱动法:数组小技巧
public class Method04 {
    public static void main(String[] args) {
        // 原始写法
        System.out.println(doSth(1));
        // 数组优化
        System.out.println(doSthNew(1));
    }

    // 原始写法
    private static int doSth(int month) {
        if (month == 1)  return 31;
        if (month == 2)  return 29;
        if (month == 3)  return 31;
        if (month == 4)  return 30;
        if (month == 5)  return 31;
        if (month == 6)  return 30;
        if (month == 7)  return 31;
        if (month == 8)  return 31;
        if (month == 9)  return 30;
        if (month == 10)  return 31;
        if (month == 11)  return 30;
        if (month == 12)  return 31;
        return 0;
    }

    // 数组优化
    private static int doSthNew(int month) {
        int[] monthDays = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        return monthDays[--month];
    }
}

5、反射

代码语言:javascript
代码运行次数:0
复制
package com.zibo.ifelse;

import java.lang.reflect.Method;

// 反射
public class Method05 {
    public static void main(String[] args) throws Exception {
        // 原始写法
        doSth("doOne");
        // 反射写法
        doSthNew("doOne");
    }

    // 原始写法
    private static void doSth(String ds) {
        if("doOne".equals(ds)){
            new DoSth().doOne();
        }else if("doTwo".equals(ds)){
            new DoSth().doTwo();
        }else if("doThree".equals(ds)){
            new DoSth().doThree();
        }else {
            System.out.println("啥也不干!");
        }
    }

    // 反射写法
    private static void doSthNew(String ds) throws Exception {
        Method method = DoSth.class.getDeclaredMethod(ds);
        DoSth doSth = DoSth.class.newInstance();
        method.invoke(doSth);
    }
}
class DoSth{
    public void doOne(){
        System.out.println("One");
    }

    public void doTwo(){
        System.out.println("Two");
    }

    public void doThree(){
        System.out.println("Three");
    }
}

6、方法引用

代码语言:javascript
代码运行次数:0
复制
package com.zibo.ifelse;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

// 方法引用
public class Method05 {
    public static void main(String[] args) {
        // 原始写法
        doSth("doOne");
        // 方法引用
        doSthNew("doOne");
    }

    // 原始写法
    private static void doSth(String ds) {
        if("doOne".equals(ds)){
            new DoSth().doOne();
        }else if("doTwo".equals(ds)){
            new DoSth().doTwo();
        }else if("doThree".equals(ds)){
            new DoSth().doThree();
        }else {
            System.out.println("啥也不干!");
        }
    }

    // 方法引用
    private static void doSthNew(String ds){
        Map<String, Consumer<DoSth>> functionMap = new HashMap<>();
        functionMap.put("doOne", DoSth::doOne);
        functionMap.put("doTwo", DoSth::doTwo);
        functionMap.put("doThree", DoSth::doThree);
        functionMap.get(ds).accept(new DoSth());
    }
}
class DoSth{
    public void doOne(){
        System.out.println("One");
    }

    public void doTwo(){
        System.out.println("Two");
    }

    public void doThree(){
        System.out.println("Three");
    }
}

7、其他

遇到大量if记住下面的口诀: 互斥条件表驱动, 嵌套条件校验链, 短路条件早return, 零散条件可组合。——知乎某大佬

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、如何优化代码中大量的if/else
    • 1、判断条件取反,提前return
    • 2、策略模式
    • 3、使用Optional
    • 4、表驱动法
    • 5、反射
    • 6、方法引用
    • 7、其他
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档