有 10000 个 if else 该如何优化?被问懵了!

news2025/1/15 19:53:28

这个问题可以看作是一道场景题,它考察一个程序员在面对复杂逻辑判断时的优化能力,也是在考察一个程序员临场发挥技术能力

方案1:策略模式

使用策略模式确实可以提升代码的优雅性,但也会存在以下问题:

  • 如果是大量的 if else 分支,比如这 1 万个,那就会有 1 万个策略类,此时就会造成类膨胀,并且随着时间的推移逐渐变得更加庞大而复杂

  • 如果是多层的 if else 嵌套,策略模式可能也无法派上用场了。

方案2:策略模式变体

这是策略模式的一种变体:

Map<Integer, Runnable> actionMap = new HashMap<>();
actionMap.put("condition1", () -> { /* 分支1的执行逻辑 */ });
actionMap.put("condition2", () -> { /* 分支2的执行逻辑 */ });
actionMap.put("conditionN", () -> { /* 分支N的执行逻辑 */ });

// 根据条件获取执行逻辑
Runnable action = actionMap.get("condition1");
if (action != null) {
    action.run();
}

这种把业务逻辑代码分离出去了,简化了单个类的代码,但如果有大量的条件映射,依然会造成单个类的膨胀和难以维护。

方案3:使用三目运算符

如果判断条件不多,只有 2、3 个的情况下可以使用三目运算符简化 if else 分支。

比如以下代码:

图片

使用三目运算符一行搞定:

图片

超过 3 个条件就不建议使用了,不然代码可读性会大大降低。

方案4:使用枚举

枚举类型可以用来表示一组固定的值,例如星期几、月份、颜色等,它提供了一种更简洁、可读性更高的方式来表示一组相关的常量。

如以下示例代码:

图片

这里我只写了一个字段,我们可以在枚举属性里面定义多个字段,这样就无需大量的 if else 判断,直接通过枚举来获取某个某一组固定的值了。

方案5:使用 Optional

Java 8 提供了一个 Optional 新特性,它是一个可以包含 null 值的容器对象,可以用来代替 xx != null 的判断。

如果项目中存在大量 xx != null 的判断,可以使用 Optional 来优化。

方案6:尽快返回

分析业务,根据 if else 的执行次数按降序排,把执行次数较多的 if 放在最前面,如果符合条件,就使用 return 返回,如下面代码:

图片

这样改可能是比较简单的方式,在很大程度上可以提升系统的性能,但是还存在以下问题:

  • 有的条件不能按执行次数排序,存在先后或者互斥关系。

  • 如果新增一个条件,可能无法马上判定它的执行次数,如果放在后面可能也还会影响性能。

  • 对类的继续膨胀和代码维护没有任何帮助。

方案7:去除没必要的 if else

比如这种:

图片

优化后:

图片

或者是这样:

方案8:合并条件

考虑这 1 万 if else 是不是真的每个都有必要,是不是可以合并归类,比如是不是可以把几百、几千个相似逻辑的归为一类,这样也能大大简化 if else 数量。

比如以下代码:

图片

优化后:

图片

这样就把返回相同值的 if 归为一类了,如果 if 较大就能大大简化代码量。

方案9:规则引擎

在许多业务应用程序中,业务决策可以通过一系列的逻辑规则来定义,规则引擎允许这些规则在运行时执行,而无需硬编码在应用程序之中。

总之,消除 if else 并没有万能的方法,也不可能全部优化掉,在实际开发中需要根据实际场景使用不同的方法,以及多种方法组合使用,这样才是正确的方式。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1675087.html

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

相关文章

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集 文章目录 代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集01背包问题理论基础一、01背包问题二、…

Transformer 模型

文章目录 前言一、模型结构 前言 Transformer 模型是由谷歌在 2017 年提出并首先应用于机器翻译的神经网络模型结构。机器翻译的目标是从源语言&#xff08;Source Language&#xff09;转换到目标语言&#xff08;Target Language&#xff09;。Transformer 结构完全通过注意力…

JS中的宏任务和微任务

JavaScript 引擎是建立在一个事件循环系统之上的&#xff0c;它实时监控事件队列&#xff0c;如果有事件就执行&#xff0c;如果没有事件就等待。事件系统是一个典型的生产消费模式&#xff0c;生产者发出事件&#xff0c;接收者监听事件&#xff0c;在UI 开发中是常见的一个设…

电源模块效率的正确测试方法

电源效率是评价电源性能的重要指标&#xff0c;它直接关系到设备的稳定性和能源的利用效率。因此&#xff0c;对电源进行效率测试显得尤为重要。电源在工作过程中&#xff0c;会有部分能量损耗&#xff0c;因此&#xff0c;电源效率的高低&#xff0c;不仅影响着设备的性能&…

CentOS 磁盘扩容与创建分区

文章目录 未分配空间创建新分区重启服务器添加物理卷扩展逻辑卷 操作前确认已给服务器增加硬盘或虚拟机已修改硬盘大小&#xff08;必须重启服务才会生效&#xff09;。 未分配空间 示例说明&#xff1a;原服务器只有40G&#xff0c;修改虚拟机硬盘大小再增加20G后硬盘变为60G。…

Python 机器学习 基础 之 监督学习 [朴素贝叶斯分类器] / [决策树] 算法 的简单说明 / [graphviz] 绘制决策树

Python 机器学习 基础 之 监督学习 [朴素贝叶斯分类器] / [决策树] 算法 的简单说明 / [graphviz] 绘制决策树 目录 Python 机器学习 基础 之 监督学习 [朴素贝叶斯分类器] / [决策树] 算法 的简单说明 / [graphviz] 绘制决策树 一、简单介绍 二、监督学习 算法 说明前的 数…

用Python的pynput库成为按键记录高手

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 揭秘键盘输入&#xff1a;pynput库的基本介绍 无论是为了安全审计、数据分析还是创建热键操作&#xff0c;能够记录和处理键盘事件都显得尤为关键。这就是pynput库发挥作用的地方。pynput是一个Python库&#xff0c…

CentOS报错: Fontconfig head is null, check your fonts or fonts configuration

错误 解决方案 这个报错的原因时java读取本地字体时发现字体损坏或者缺失&#xff0c;只需要补充一下字体就可以了&#xff0c;解决方法安装FontConfig组件即可&#xff1a; sudo yum install fontconfig

AIConnect 综合算力服务网络:引领智能未来,创造无限可能性!

2022年11月30日&#xff0c;由OpenAI开发的大模型聊天机器人GPT-3发布&#xff0c;首个完全意义上通过图灵测试的人工智能诞生了。这一里程碑事件的启发了人们对AI技术的发展和应用。在短短两年的时间里&#xff0c;各式各样的聊天AI&#xff0c;图片生成AI&#xff0c;视频生成…

5.10.4 Vision Transformer的条件位置编码(CPE)

用于视觉 Transformer 的条件位置编码&#xff08;CPE&#xff09;方案与之前预定义且独立于输入标记的固定或可学习位置编码不同&#xff0c;CPE 是动态生成的&#xff0c;并以输入标记的局部邻域为条件。 CPE 可以轻松泛化到比模型在训练期间见过的输入序列更长的输入序列。…

官宣!MongoDB Atlas再添新功能!进一步简化构建现代应用程序

亮点前瞻 ● MongoDB Atlas Stream Processing全面可用&#xff0c;开发者能够更轻松地使用实时数据&#xff0c;在统一环境中构建事件驱动型应用程序 ●MongoDB Atlas Search Nodes上线 Microsoft Azure&#xff0c;组织能够隔离和扩展生成式AI工作负载&#xff0c;并将查询…

Naive RAG 、Advanced RAG 和 Modular RAG 简介

简介&#xff1a; RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的机制&#xff0c;用于提高大型语言模型&#xff08;LLMs&#xff09;在特定任务上的表现。随…

串联所有单词的子串 ---- 滑动窗口

题目链接 题目: 分析: 我们上次做的题目, 是找到所有字符的异位词, 和这道题有些类似, 使用记录有效字符的个数找到子字符, 此题无非是把字符变成了字符串题目回顾 有一下几方面不同, 我们以示例1为例: 1. 哈希表 上次我们使用的是哈希数组, 因为数组的下标可以是字符, 现…

elasticsearch-head 源码运行

1、下载安装nodejs 地址&#xff1a;Node.js — Run JavaScript Everywhere 2、git下载 elasticsearch-head 源码 地址&#xff1a;GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster 3、使用cmd 进入 elasticsearch-head 目录 4、依次执…

C for Graphic:遮罩显示(一)

模板缓冲一般用于遮罩渲染的功能&#xff0c;其原理很以前聊过&#xff08;模板缓冲原理&#xff09;&#xff0c;就不再啰嗦了。 现在实现一个功能&#xff1a;使用一个长方体&#xff08;或任意物体&#xff09;遮罩渲染对象&#xff08;比如一个球&#xff09;。 …

好用无广的桌面便签app 能管理待办事项的便签软件

在忙碌的工作和生活中&#xff0c;我们每天都面临着大量的待办事项。这些琐碎却重要的事务很容易混淆或遗忘&#xff0c;给我们带来不必要的麻烦和压力。幸运的是&#xff0c;选择一款优秀的便签app&#xff0c;可以有效地帮助我们管理这些待办事项&#xff0c;让工作和生活更加…

CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷

分析 CVE-2024-4761 和 POC 代码 CVE-2024-4761 描述 CVE-2024-4761 是一个在 V8 引擎中发现的越界写漏洞&#xff0c;报告日期为 2024-05-09。这个漏洞可能允许攻击者通过特制的代码执行任意代码或者造成内存破坏&#xff0c;进而导致程序崩溃或其他不安全行为。 POC 代码解…

干部管理系统的功能解析

在日益复杂的组织运营环境中&#xff0c;干部管理系统已成为组织人事部门不可或缺的得力助手。该系统集成了多项先进功能&#xff0c;极大地提升了干部信息的全面管理、选拔任用、培训发展等工作的便捷性和效率。以下是对干部管理系统主要功能的深入解析。 一、信息管理功能 …

CH340 RTS DTR引脚编程驱动OLED

运行结果 硬件连接&#xff08;在连接线上串接300R电阻&#xff09; 下面是c#实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks;using uint8 System.Byt…