前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >if-else“烦不烦”,让代码简单、高效、优雅起来

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

作者头像
IT大咖说
发布2020-05-19 17:57:08
8520
发布2020-05-19 17:57:08
举报
文章被收录于专栏:IT大咖说IT大咖说

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

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

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

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

优化前代码:

代码语言:javascript
复制
if (str.equals("java")) {
    // 业务代码 ! true;
} else {
    return ;
}

优化后代码:

代码语言:javascript
复制
if (str.equals("java")) {
    return ;
}
return false;

缺点:if else多的话,没什么大的效果

2,使用条件三目运算符

使用条件三目运算符可以简化某些 if-else,使代码更加简洁,更具有可读性。

优化前:

代码语言:javascript
复制
int  price ;
if(condition){
    price = 80;
}else{
    price = 100;
}

优化后:

代码语言:javascript
复制
int price = condition?80:100;

缺点:正对只有if 和esle这种两个选择的时候,还可以,但是多了的话,写三元表达式的话,理解起来就费力了,如下

代码语言:javascript
复制
int price = (condition>0) ? ((condition<10)? 8 : 11)  : ((condition>-10)? -8 : -11) ;

3,使用 Map

使用 Map 数组,把相关的判断信息,定义为元素信息可以直接避免 if else 判断,实现代码如下。

优化前代码:

代码语言:javascript
复制
if (t == 1) {
    type = "name";
} else if (t == 2) {
    type = "id";
} else if (t == 3) {
    type = "mobile";
}

我们先定义一个 Map 数组,把相关判断信息存储起来:

代码语言:javascript
复制
Map<Integer, String> typeMap = new HashMap<>();
typeMap.put(1, "name");
typeMap.put(2, "id");
typeMap.put(3, "mobile");

之前的判断语句可以使用以下一行代码代替了:

代码语言:javascript
复制
type = typeMap.get(ty);

4,使用枚举

JDK 1.5 中引入了新的类型——枚举(enum),我们使用它可以完成很多功能,例如下面这个。

优化前代码:

代码语言:javascript
复制
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;
}

优化时,我们先来定义一个枚举:

代码语言:javascript
复制
public enum TypeEnum {
    Name(1), Age(2), Address(3);
    public Integer typeId;
    TypeEnum(Integer typeId) {
        this.typeId = typeId;
    }
}

有了枚举之后,以上 if-else 逻辑分支,可以优化为一行代码:

代码语言:javascript
复制
typeId = TypeEnum.valueOf("Name").typeId;

缺点:能力在此,暂无发现

5,合并条件表达式

在项目中有些逻辑判断是可以通过梳理和归纳,变更为更简单易懂的逻辑判断代码,如下所示。

优化前代码:

代码语言:javascript
复制
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";
}

优化后代码:

代码语言:javascript
复制
if ("西安".equals(city) || "029".equals(area) || "陕西".equals(province)){
    return "xi'an";
}

缺点:这种是对结果相同的做法合并,但是返回值不同,就傻了

6,使用 Optional

从 JDK 1.8 开始引入 Optional 类,在 JDK 9 时对 Optional 类进行了改进,增加了 ifPresentOrElse() 方法,我们可以借助它,来消除 if else 的判断,使用如下。

优化前代码:

代码语言:javascript
复制
String str = "java";
if (str == null) {
    System.out.println("Null");
} else {
    System.out.println(str);
}

优化后代码:

代码语言:javascript
复制
Optional<String> opt = Optional.of("java");
opt.ifPresentOrElse(v -> 
 System.out.println(v), () -> System.out.println("Null"));

缺点:对于大多使用JDK 1.8的公司来说,这个实现起来得改JDK版本,不切实际

7,策略模式+工厂方法消除 if else

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

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

代码语言:javascript
复制
//勋章接口
public interface IMedalService {
    void showMedal();
}

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

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

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

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

8,选择性的使用 switch

很多人都搞不懂 switch 和 if else 的使用场景,但在两者都能使用的情况下,可以尽量使用 switch,因为 switch 在常量分支选择时,switch 性能会比 if else 高。

if else 判断代码:

代码语言:javascript
复制
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 代码:

代码语言:javascript
复制
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 代码块,实现代码如下:

代码语言:javascript
复制
// 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

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

IT大咖说 | 关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1,提前 return,去除不必要的 else
  • 2,使用条件三目运算符
  • 3,使用 Map
  • 4,使用枚举
  • 5,合并条件表达式
  • 6,使用 Optional
  • 7,策略模式+工厂方法消除 if else
  • 8,选择性的使用 switch
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档