结合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.xdnf.cn/news/148662.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

可编辑PPT | 能源企业数字化框架、数字化运营及数字化平台建设方案

项目背景及需求理解 首先提出了全球能源互联网的概念&#xff0c;强调了清洁能源和电能替代的重要性&#xff0c;并介绍了德国工业4.0战略以及泛在电力物联网的创新。文档探讨了信息化与工业化的深度融合&#xff0c;以及云计算、大数据、物联网和移动应用等新技术在能源行业的…

超详细超实用!!!AI编程之cursor编写一个官网(二)

云风网 云风笔记 云风知识库 一、新建html文件 选中添加index.html,输入编写官网要求&#xff0c;自动生成代码&#xff0c;先来个简单的。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"…

博图安装(版本:V18)

目录 一、软件安装 Ⅰ、博图编程软件安装 Ⅱ、仿真环境安装 二、许可证安装 安装教程 工作中常用的是编程软件&#xff0c;组态软件以及仿真&#xff0c;编程软件和组态软件是一起的&#xff0c;因此先演示编程软件的安装 软件安装总共分为两部分&#xff0c;安装软件和安…

对比评测5款实用在线翻译工具,包括有道在线翻译

大家好&#xff0c;今天咱们来聊聊在线翻译工具。在这个信息爆炸的时代&#xff0c;语言不再是沟通的障碍&#xff0c;多亏了这些强大的翻译神器。今天&#xff0c;我将带大家比较五款热门的在线翻译工具&#xff0c;究竟谁更胜一筹呢&#xff1f;让我们一探究竟&#xff01; …

STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器

目录 一、AT24CXXX 系列存储器介绍1、基本信息2、寻址方式3、页地址与页内单元地址4、I2C 地址5、AT24CXX 的数据读写5.1 写操作5.1.1 按字节写5.1.2 按页写 5.2 读操作5.2.1 当前地址读取5.2.2 随机地址读取5.2.3 顺序读取 二、代码实现1、ctl_i2c2、at24c3、测试程序 I2C 相关…

Linux复习--网络基础(OSI七层、TCP三次握手与四次挥手、子网掩码计算)

一、ISO/OSI七层模型的分层与作用 1、ISO/OSI的七层模型 2、作用 应用层&#xff1a;为用户提供服务&#xff0c;给用户一个操作界面表示层&#xff1a;数据提供表示&#xff1b;加密&#xff1b;压缩&#xff1b;会话层&#xff1a;确定数据是否需要进行网络传递传输层&…

从0开始linux(5)——vim

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 vim的多种模式底行模式命令命令模式视块模式&#xff08;visual block&#xff09; vim的配置 vim是linux系统的文本编辑器。就像windows的记事本一样。 使用vim指令可以使用vim打开一个文本文…

5G Multicast/Broadcast Services(MBS) (四)

这篇是有关MBS RRC相关的一些基本内容,内容不多,但是感觉很关键,主要包括SI,MBS网络侧相关的内容,L2 协议架构,cell reselection prioritity以及MBS接收的一些内容,希望有帮助。 SI 在MBS场景中,SI和常规5G一样分为Minimum SI和Other SI。Minimum SI是MIB和SIB1,Min…

程序员画图神器,开源

https://github.com/jgraph/drawio 开源、免费、简洁、方便的画图工具&#xff0c;可作为visio或亿图的替代品 drawio简介 在流程图、思维导图、UML图等图表绘制领域,draw.io可以说是一款优秀和受欢迎的在线作图工具。draw.io由JGraph开发,完全开源,拥有超过3万个GitHub Star…

芯片仓管系统主要适用场景有哪些

随着科技产业的飞速发展&#xff0c;芯片作为电子设备的核心部件&#xff0c;其库存管理成为了企业运营中不可或缺的一环。芯片仓管系统&#xff0c;作为专为高效、精准管理芯片库存而设计的信息化工具&#xff0c;正逐步在多个关键领域展现出其不可或缺的价值。那么&#xff0…

APScheduler、Django、Python实现定时任务,以及任务操作

环境&#xff1a;Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4 背景&#xff1a;工作需要使用且用法较为复杂&#xff0c;各种功能基本都使用了 事件&#xff1a;20240920 说明&#xff1a;记录&#xff0c;方便后期自己查找 1、搭建基础环境 文件结构图…

免费分享一套SpringBoot+Vue火车票订票管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue火车票订票管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringbootVue火车票订票管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 传统办法管理信息首先需要花费的时间比较多&…

基于Springboot个性化图书推荐系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

优思学院|TQM和ISO9001有什么关系?

TQM 和 ISO 9001有什么关系&#xff1f;我们把这个问题交给AI&#xff0c;它的回答是&#xff1a; 老实说&#xff0c;说它答错&#xff0c;又不算是错&#xff0c;但说它答对&#xff0c;也不算&#xff0c;总之就是一种模凌两可的感觉。 为什么会这样&#xff1f;因为管理中…

【gradio介绍】Python 可视化 web 神器---gradio介绍

Gradio是一个开源的Python库&#xff0c;专为帮助开发者快速搭建和分享机器学习模型、API或任意Python函数的用户界面&#xff08;UI&#xff09;而设计。它基于FastAPI和Svelte&#xff0c;是一个易于部署且功能强大的Web界面构建工具&#xff0c;特别适用于展示和测试机器学习…

在产品上扩大库存?教你一招!全开源!

几乎所有人都会遇到的头疼问题&#xff1a;内存不够&#xff0c;因为很多照片、音频、文档药存储。。。 我们都知道芯片的储存都是寸土寸金的&#xff0c;内部不够只能外扩&#xff01; 有没有简单一点的方法呢&#xff1f;实在不想编写各种驱动&#xff0c;替换Flash&#x…

探索未来:MultiOn,AI的下一个革命

文章目录 探索未来&#xff1a;MultiOn&#xff0c;AI的下一个革命背景&#xff1a;为什么选择MultiOn&#xff1f;MultiOn是什么&#xff1f;如何安装MultiOn&#xff1f;简单的库函数使用方法场景应用常见问题及解决方案总结 探索未来&#xff1a;MultiOn&#xff0c;AI的下一…

conda环境下module ‘numba.types‘ has no attribute ‘Macro‘问题解决

1 问题描述 conda环境下运行数据处理&#xff0c;报出如下错误&#xff1a; Traceback (most recent call last):File "train_preprocess.py", line 13, in <module>import audioFile "/opt/service/lipsync/audio.py", line 1, in <module>…

增强网络威胁防御能力的云安全新兴技术

一些行业专家强调了基于云的运营的独特网络安全需求&#xff0c;并指出保护敏感数据与传统的本地网络不同。尽管新兴技术并没有改变网络安全专业人员与犯罪分子之间持续的斗争&#xff0c;但它们提高了赌注&#xff0c;使斗争变得更加复杂。 如今&#xff0c;我们面对的是技术…

药用植物的空间多组学:从生物合成途径到工业应用-文献精读51

Spatial multi-omics in medicinal plants: from biosynthesis pathways to industrial applications 药用植物的空间多组学&#xff1a;从生物合成途径到工业应用 摘要 随着分子测序和成像技术的快速发展&#xff0c;药用植物的多组学研究进入了单细胞时代。我们讨论了空间多…