Java中减少if-else的几种方式

 更新时间:2024年01月24日 16:03:57   作者:Java斌  
if判断语句是很多编程语言的重要组成部分,但是,若我们最终编写了大量嵌套的if语句,这将使得我们的代码更加复杂和难以维护,本文主要介绍了Java中减少if-else的几种方式,具有一定的参考价值,感兴趣的可以了解一下

有时候,代码中充斥着大量的if-else语句并不是让你的同事们完全理解的正确方式。

所以,无论你是初学者还是已经很擅长你的工作,都应该让你的代码更加复杂和可读。

你需要尝试的第一件事是在你的代码中去除if-else语句。以下是一些建议。

1: 立即返回

假设有以下的代码:

public boolean isValid(String condition) {
  boolean result;
  if (condition != null){
      if (condition.equals("hi") {
        result = true;
      } else {
         result = false;
      }
  } else {
    result= false;
  }
  return result;
}

这种代码通常用于提前返回,删除了不必要的else。

public boolean isValid(String condition) {
  if (condition == null) {
    return false;
  }

  if (condition.equals("hi") {
    return true
  }

  return false;
}

这种方法通常只适用于简单的结构,我们可以提前返回来消除一些不必要的if-else语句。

2: 枚举

比如以下代码:

public String getLabel(int status) {
    String label;
    if (1 == status) {
        label = "Padding";
    } else if (2 == status) {
        label = "Paid";
    } else if (3 == status) {
        label = "Success";
    } else if (4 == status) {
        label = "Failed";
    }
    return label;
}

也许你可以说,没有人写这样的代码。但实际上,这种写法是相当常见的。每个公司都有这样的代码

这种代码用枚举就能解决:

@Getter
@AllArgsConstructor
public enum StatusLabelEnum {
    Padding(1, "Padding"),
    Paid(2, "Paid"),
    Success(3, "Success"),
    Failed(4, "Failed"),
    ;

    private int status;
    private String label;

    public static String getLabelByStatus(int status) {
        for (StatusLabelEnum labelEnum : StatusLabelEnum.values()) {
            if (labelEnum.getStatus() == status) {
                return labelEnum.getLabel();
            }
        }
        return "Unknown";
    }
}

通过这种枚举,上述代码可以直接优化为一行代码:

public String getLabel(int status) {
  return StatusLabelEnum.getLabelByStatus(status);
}

当然正常的项目不是这么简单的k-v键值对的,还有更复杂的逻辑,如果返回值是固定的,枚举也是一个简单的解决方案。

3: Optional 来解决if判断

我相信你们肯定有项目,在这些项目中有一个非空的判断,如果为空,则抛出异常或返回值。:

public int getOrderStatus(UUID id) {
  Order order = getOrderById(id);
  if (order == null) {
      return 1;
  } else {
      return order.getOrderStatus();
  }
}

我们可以使用Optional来非常优雅地解决它:

public int getOrderStatus(UUID id) {
  Order order = getOrderById(id);
  return Optional.ofNullable(order).map(Order::getOrderStatus).orElse(1);
}

4: 数据表驱动

表驱动方法是一种允许您在不使用过多的if-else语句的情况下,在表格中查找信息的方法。

如有以下代码:

if ("code1".equals(action)) {
    doAction1();
} else if ("code2".equals(action)) {
    doAction2();
} else if ("code3".equals(action)) {
    doAction3();
} else if ("code4".equals(action)) {
    doAction4();
} else if ("code5".equals(action)) {
    doAction5();
}

优化代码:

//Definition
Map<String, Function<?> action> actionMap = new HashMap<>();
action.put("code1",() -> {doAction1()});
action.put("code2",() -> {doAction2()});
action.put("code3",() -> {doAction3()});
action.put("code4",() -> {doAction4()});
action.put("code5",() -> {doAction5()});

//use case
actionMap.get(action).apply();

这并不是一种很好的实现表驱动方法的方式,因为代码可能会显得非常臃肿

多实现类的方法优化:

//1. Define interface
public interface ActionService {
    void doAction();
}

//2. Define implementations
public class ActionService1 implements ActionService{
    public void doAction() {
        //do something
    }
}

//3. add to table
Map<String, ActionService> actionMap = new HashMap<>();
action.put("code1",new ActionService1());
action.put("code2",new ActionService2());
action.put("code3",new ActionService3());
action.put("code4",new ActionService4());
action.put("code5",new ActionService5());

//4. use it
actionMap.get(action).doAction();

到此这篇关于Java中减少if-else的几种方式的文章就介绍到这了,更多相关Java 减少if-else内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 如何用java实现分页查询

    如何用java实现分页查询

    这篇文章主要介绍了如何用java实现分页查询,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Intellij IDEA中一次性折叠所有Java代码的快捷键设置

    Intellij IDEA中一次性折叠所有Java代码的快捷键设置

    这篇文章主要介绍了Intellij IDEA中一次性折叠所有Java代码的快捷键设置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java中HashMap里面key为null存放到哪

    Java中HashMap里面key为null存放到哪

    这篇文章主要介绍了Java中HashMap里面key为null存放到哪,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • java中对象和Map互相转换的几种常见方式举例

    java中对象和Map互相转换的几种常见方式举例

    Map在日常开发应用中的频率很高,最常用的实现类是HashMap和有序的TreeMap,下面这篇文章主要给大家介绍了关于java中对象和Map互相转换的几种常见方式举例,需要的朋友可以参考下
    2024-01-01
  • Java解析zip文件,并识别压缩包里面的文件转换成可操作的IO流方式

    Java解析zip文件,并识别压缩包里面的文件转换成可操作的IO流方式

    这篇文章主要介绍了Java解析zip文件,并识别压缩包里面的文件转换成可操作的IO流方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java 加密解密基础分类及模式归纳整理

    Java 加密解密基础分类及模式归纳整理

    这篇文章主要介绍了Java加密解密基础分类方法汇总的相关资料,需要的朋友可以参考下
    2017-04-04
  • java读取JSON文件的多种实现方式

    java读取JSON文件的多种实现方式

    这篇文章主要介绍了java读取JSON文件的多种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java集合框架源码分析之LinkedHashMap详解

    Java集合框架源码分析之LinkedHashMap详解

    这篇文章主要介绍了Java集合框架源码分析之LinkedHashMap详解,内容包括了linkedhashmap的简介和源码剖析以及关于LinkedHashMap的源码总结,内容丰富,需要的朋友可以参考下。
    2017-09-09
  • RocketMQ的push消费方式实现示例

    RocketMQ的push消费方式实现示例

    这篇文章主要为大家介绍了RocketMQ的push消费方式实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-08-08
  • mybatis使用Integer类型查询可能出现的问题

    mybatis使用Integer类型查询可能出现的问题

    这篇文章主要介绍了mybatis使用Integer类型查询可能出现的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论