结合HashMap与Java 8的Function和Optional消除ifelse判断

简介: `shigen`是一位致力于记录成长、分享认知和留住感动的博客作者。本文通过具体代码示例探讨了如何优化业务代码中的if-else结构。首先展示了一个典型的if-else处理方法,并指出其弊端;然后引入了策略模式和工厂方法等优化方案,最终利用Java 8的Function和Optional特性简化代码。此外,还提到了其他几种消除if-else的方法,如switch-case、枚举行、SpringBoot的IOC等。一起跟随shigen的脚步,让每一天都有所不同!

shigen坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen

在文章的开头我们先从这些场景进入本期的问题:

  1. 业务代码中各种if-else有遇到过吗,有什么好的优化方式;
  2. java8出来这么多年了,Function、Optional有经常用到吗?

可能文字描述还是略显抽象,我们直接上代码:

public class SimplifyIfElse {
   

    public String handleQuestion(String type, String detail) {
   
        if ("A".equals(type)) {
   
            return "call methodA to handle" + detail;
        } else if ("B".equals(type)) {
   
            return "call methodB to handle" + detail;
        } else if ("C".equals(type)) {
   
            return "call methodC to handle" + detail;
        } else {
   
            throw new IllegalArgumentException("invalid type: " + type);
        }
    }
}
AI 代码解读

这种代码其实很常见的,使用起来也就是一行调用:

    public static void main(String[] args) {
   
        assert new SimplifyIfElse().handleQuestion("B", "detail").equals("call methodB to handledetail");
    }
AI 代码解读

这里直接用的assert进行的断言验证。

但是有没有考虑到一些问题:

  • 这是明显的坏味道的代码,各种判断,看起来很是不舒服;
  • 后期加上同样的逻辑,是不是if-else的体量还会继续增加,维护的成本也在增加。

也许稍微有点经验的同学会想到我用策略模式、工厂方法等等来优化一下这段代码。可以,至少会设计模式的基本使用了,但是对于这样同类型的问题,我们没有必要整的这么复杂。

不管是策略模式还是工厂方法,其底层还是维护的一个hashMap,对应的key和value分别是问题标识和问题的解决方法。

掌握到这个核心,我们来优化下现存的代码:

    private static final HashMap<String, Function<String, String>> QUESTION_HANDLER_MAP = new HashMap<>();

    static {
   
        QUESTION_HANDLER_MAP.put("A", detail -> "call methodA to handle" + detail);
        QUESTION_HANDLER_MAP.put("B", detail -> "call methodB to handle" + detail);
        QUESTION_HANDLER_MAP.put("C", detail -> "call methodC to handle" + detail);
    }

    public String handleQuestionV2(String type, String detail) {
   
        return Optional.ofNullable(QUESTION_HANDLER_MAP.get(type).apply(detail)).orElseThrow(() -> new IllegalArgumentException("invalid type: " + type));
    }
AI 代码解读

这里用到了java8的新特性,Function和Optional,其中:

  • Function是一个功能接口,Function中的T和R都是范型,分别表示输入类型和输出类型;
  • Optional这里不再做过多的解释,就是优雅的判空

代码这样改造之后,后期只需要往QUESTION_HANDLER_MAP增添新的元素即可,大大的简化了代码。

当然常见的消除if-else代码的方式还有:

  1. 借助switch-case
  2. 借助枚举抽象
  3. SpringBoot的IOC能力

这里先在此点一下,有时间继续分享。附:代码截图:

本期代码截图

与shigen一起,每天不一样!

目录
打赏
0
10
10
0
46
分享
相关文章
Dating Java8系列之巧用Optional之优雅规避NPE问题
Dating Java8系列之巧用Optional之优雅规避NPE问题
83 0
|
10月前
|
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
204 4
|
11月前
|
JAVA——List中剔除空元素(null)的三种方法汇总
JAVA——List中剔除空元素(null)的三种方法汇总
JavaScript 中 五种迭代数组的方法 every some map filter forEach
本文介绍了JavaScript中五种常用数组迭代方法:every、some、filter、map和forEach,并通过示例代码展示了它们的基本用法和区别。
JAVA 使用实用的参数判空技巧Optional与@Valid,告别if 和else
JAVA 使用实用的参数判空技巧Optional与@Valid,告别if 和else
590 0
JAVA 使用实用的参数判空技巧Optional与@Valid,告别if 和else
Java使用lambda对List,Set进行排序
前言 平常使用List和Set进行排序,还是很常见的,大多数的场景是对Integer,String,Long这种的排序,那么我今天先总结下难的,对一个实体类进行排序。 正文 首先定义一个实体类: package model; /** * 介绍人的实体类 * @author luckyharr...
2472 0
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(上)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(上)
【Java】ForEach_用Lambda & 方法引用实现同样的效果
【Java】ForEach_用Lambda & 方法引用实现同样的效果
102 0
|
11月前
|
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
414 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等