当前位置: 首页 > news >正文

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

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);}}
}    

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

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

这里直接用的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));}

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

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

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

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

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

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

本期代码截图

与shigen一起,每天不一样!


http://www.mrgr.cn/news/33666.html

相关文章:

  • ubontu--cuDNN安装
  • Elman 神经网络算法详解
  • Go开发指南- Goroutine
  • 为什么在Ubuntu下使用VScode开发C++程序时需要手动配置链接库
  • 深入浅出 ChatGPT 底层原理:Transformer
  • <el-popover>可以展示select change改变值的时候popover 框会自动隐藏
  • idea2021git从dev分支合并到主分支master
  • Vue的指令v-model的原理
  • 反序列化- Jackson...
  • ComfyUI三个超实用插件,一定不要错过!
  • JavaEE: 创造无限连接——网络编程中的套接字
  • Python中的null是什么?
  • 梧桐数据库(WuTongDB):向量化查询优化器的技术细节介绍
  • 一行代码实现快速排序
  • OJ在线评测系统 后端开发数据库初始化工作 开发库表 建立数据库索引 Mybatis映射初始化接口开发
  • golang学习笔记2-语法要求,注释与代码风格
  • pycharm加载虚拟环境及运行代码
  • 【VUE3.0】动手做一套像素风的前端UI组件库---Radio
  • 模拟电路工程师面试题
  • Android——Application
  • awd初试
  • 车辆重识别(CVPR2016图像识别的深度残差学习ResNet)论文阅读2024/9/21
  • python异常处理知识简记
  • 1542. 找出最长的超赞子字符串
  • Snap 发布新一代 AR 眼镜,有什么特别之处?
  • PCB设计中百兆以太网是否需要差分布线?