聊聊java中一些减少if-else 的编码方式!

Java MD5实战:5大应用场景、工具选型与安全避坑指南 哈希函数是计算机科学中用于将任意长度数据映射为固定长度摘要的核心算法,其单向性和抗碰撞性原理使其成为数据完整性校验和指纹生成的基石。在工程实践中,这种技术价值体现在高效的数据一致性验证、去重和唯一标识生成等场景。MD5作为一种经典的哈希算法,尽管在密码学安全领域存在已知碰撞漏洞,但在非安全关键的业务场景中,凭借其计算速度快、实现简单的特点,依然被广泛用于文件校验、接口签名防篡改、海量数据去重、缓存键生成和数据库哈希索引优化等具体应用。本文聚焦于Java生态,深入探讨MD5在数据完整性校验和生成唯一标识等场景 阅读详情

01 前言

前段时间在阅读别人所写的代码的时候 , 发现其中一些业务相关的方法体内 , 出现了比较多的if-else语句多层嵌套的情况 . 首先我个人不是不提倡写if-else语句 , 不得不说 , 很多时候 , 在写某些逻辑 使用if-else 去做判断 , 代码看起来还是十分直观的 , 但是如果滥用if-else , 形成多层嵌套或者形成, 其中每个case 还包含了大量的逻辑 , 此时从可读性来说 , 使用if-else就有点得不偿失了 . 而且某些时候 , 可能并不需这么多的if-else , 或者是可以使用其他编码方式从而达到减少的if-else 的效果 .

减少if-else 的使用的方式有很多 , 例如设计模式层面的策略模式或者是责任链模式 . 而这里跟大家分享一下一些个人在日常编码过程中经常用到的 , 比较简单的 、从编码习惯层面上的方式 , 去一些减少不必要if-else使用 . 由于本人只是一个小菜鸟 , 如果有写得不对的地方 , 恳请批评指正 .

02 一些减少if-else的编码方式

2.1 方式一 : 提前return

首先展示一段代码示例 :

if (condition1) {
    if (condition2) {
        return getSomething();
    } else {
        return 0;
    }
} else {
    return 0;
}

修改后的代码如下 :

//这里最好对这个flag所判断的逻辑补充注释进行描述
boolean flag = !condition1 || (condition1 && !condition2)
if(flag) {
	return 0;
}

if (condition1 && condition2) {
    return getSomething();
} 

如果存在已知在某些条件下 , 需要返回固定值的逻辑 , 可以将这部分逻辑抽取为一个独立的 if-else block , 并置于其他if-else block的前面 , 当符合该特定条件时 , 直接提前 return 固定值 . 这种方式最直接的效果就是降低if-else的嵌套数量 .

 

2.2 方式二 : 使用三目运算符

先上例子 , 这里以一个业务场景为例 :

查询某条评论的图片URL列表 (如果有 , 评论的图片url列表以JSON数组字符串格式保存在评论表中)

修改前的代码如下 :

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

String imgListStr = comment.getImgList();
if(StringUtils.isEmpty(imgListStr)) {
    return null;
}

return JSON.parseArray(imgListStr, String.class);

修改后 :

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

String imgListStr = comment.getImgList();
return StringUtils.isEmpty(imgListStr)) ?
    null : JSON.parseArray(imgListStr, String.class);

 

2.3 方式三 : 使用Assert断言

在编写业务代码过程中 , 如果需要对某些特定的条件进行判断 , 且当条件不满足时需要抛出异常 . 对于这种场景 , 除了使用上面三目运算符的示例当中的if方式 , 还可以通过使用Spring Framework 给我们提供的 Assert 工具类进行 .

其中常用的API 有 :

  • isTrue(boolean expression , String message) : 当expressio == false时 , 会抛出异常 , 异常的message则为第二个入参 ;
  • void notNull(@Nullable Object object, String message) : 同上 , 当object == null 时 , 会抛出异常;
  • void notEmpty(@Nullable Collection<?> collection, String message) : 同上 , 当集合对象为null或者集合元素为空时 , 会抛出异常 .
  • .....

还有其他较多方法 , 可以直接看源码的解析 , 当然实际上isTrue() 已经够用了 , 如果需要更加的语义化 , 可以使用对应的API .

修改前代码 :

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

修改后代码 :

 Assert.isTrue(Objects.nonNull(comment),"评论不存在或已被删除");
 Assert.notNull(comment,"评论不存在或已被删除");

目前Assert工具方法只能抛出单一一种异常 java.lang.IllegalArgumentException , 如果需要自定义所抛出的异常 , 则该方式不适用 .

 

2.4 方式四 : 使用Optional

Optional是 java8 的新特性 , 相当于一个对象的容器 , 主要用于对象的null值校验 , 以及在进行校验后可链式地进行后续操作 , 如 : 抛出异常、null替换 等 .

其中我个人比较常用的几个方法为 :

  • static <T> Optional<T> ofNullable(T value) : 使用Optional 将对象进行包裹 ;
  • T orElse(T other) : Optional中的对象为null时 ,返回入参的对象 .
  • T orElseGet(Supplier<? extends T> other) : Optional中的对象为null时 , 返回Supplier 提供的值 ;
  • T orElseThrow(Supplier<? extends X> exceptionSupplier) : Optional中的对象为null时 , 抛出supplier提供的自定义异常

代码示例 :

Message message1 = Optional.ofNullable(getById(messageId))
    .orElseThrow(() -> new RuntimeException("消息不存在!"));

Message message2 = Optional.ofNullable(getById(messageId))
    .orElse(new Message());

Message message3 = Optional.ofNullable(getById(messageId))
    .orElseGet(Message::new);

由于我日常需要的进行空值判断的比较多的场景是从数据库查询数据完毕时 , 需要查询结果进行空值判断 . 由于我所在的公司使用的持久层框架是mybatis , 不像Spirng Boot 2.x 默认版本的JPA 那样DAO层方法支持返回值为Optional , 所以这里如果需要使用Optional , 只能手动去使用上面列举的第一个方法对查询结果进行包装 .

当然 , IDEA其实已经给我们提供了该包装方式的热键了 , 如下图所示 :

03 结语

个人的一些减少if-else 编码习惯分享就这里了 , 这几种方式里面 , 我个人觉得效果最明显的还是第一种 提前return , 很多时候 , 提前return 也可以很好降低一段代码的复杂度 .

当然如果必须要使用大量的if-else 去控制逻辑时 , 在每个condition 标明一下注释还是一个挺不错的习惯 .


 

FPGA入门指南:从零搭建开发环境到完成第一个LED闪烁实验 FPGA(现场可编程门阵列)是一种通过硬件描述语言构建可重构数字电路的技术,其核心原理是利用并行处理架构实现硬件级定制。在数字信号处理、通信协议和AI加速等领域,FPGA凭借其低延迟和高能效优势展现出独特的技术价值。对于初学者而言,掌握Verilog语言和Vivado开发环境是入门的关键步骤。通过搭建FPGA开发环境,完成LED控制等基础实验,可以逐步理解时序约束和硬件调试方法。本文以Xilinx Artix-7开发板为例,详细演示从工程创建、仿真验证到实际上板调试的全流程,帮助开发者避开常见陷阱,建立系统 阅读详情

相关推荐

MATLAB实现RSA加密算法:从原理到攻防实践

非对称加密是现代信息安全体系的基石,其核心在于利用数学难题(如大数分解)实现密钥的安全分发。RSA作为最经典的非对称加密算法,通过公钥与私钥的配对,解决了对称加密中的密钥交换难题。其技术价值在于为数字签名、SSL/TLS协议等提供了关键的安全支撑,广泛应用于电子商务、安全通信等领域。本文聚焦于利用MATLAB实现RSA算法,深入剖析其数论原理与工程实现细节,并探讨针对因式分解攻击、选择密文攻击等常见攻击面的模拟与防护策略,为密码学教学与原型验证提供了一条清晰的实践路径。

weixin_30855099的博客 351

【优化】IF-ELSE 代码结构的优化

1. 前言 代码中,如果 if-else 语句比较多,阅读起来比较困难,维护性较差,很容易出bug。接下来,此文将介绍优化 if-else 代码的八种方案 2. 优化方案 方案一:提前 return,去除不必要的else 如果 if-else 代码块包含 return 语句,可以考虑通过提前 return,把多余 else 干掉,使代码更加优雅 优化前: if (condition) { // TODO } else { return; } 优化后: if (!conditio

sco5282的博客 3134

Python项目代码太多if-else? 这样优化才优雅!

代码中不可避免地会出现复杂的if-else条件逻辑,而简化这些条件表达式是一种提高代码可读性极为实用的技巧。在 Python 中,有多种方法可以避免复杂的 if-else 条件逻辑,使代码更加清晰和易于维护。

海哥python的博客 2618

想减少代码中的if等判断来提高代码运行速度,有哪些方法可以尝试?

通过减少代码中的条件判断来提高代码的运行速度,通常可以尝试以下方法:使用多态和继承:通过使用多态和继承,可以在运行时选择不同的代码路径,而不需要使用大量的条件判断语句。这样可以减少条件判断的数量,提高代码的可读性和性能。使用查表法:将条件判断转换为查表操作。可以创建一个预先计算好的查找表,将条件判断的结果存储在表中,然后通过查表的方式获取结果,而不需要进行条件判断。这种方法适用于条件判断的取值范围较小且有限的情况。优化算法和数据结构:通过选择更高效的算法和数据结构,可以减少代码中的条件判断。

weixin_45752679的博客 1777

如何优雅的替换掉Java代码中的if else

主要介绍了如何优雅的替换掉Java代码中的if else,帮助大家优化自己的Java代码,提高可读性与简洁性,感兴趣的朋友可以了解下

通达信抓波段指标(主图)

VAR3:=IF(INBLOCK('科创板'),VART20,IF(INBLOCK('创业板') AND DATE>1200823,VART20,IF(INBLOCK('ST板块'),VART5,VART10)));VAR5:=IF(INBLOCK('科创板'),CT20,IF(INBLOCK('创业板') AND DATE>1200823,CT20,IF(INBLOCK('ST板块'),CT5,CT10)));曾涨停/紫色细K线:青字"炸",涨停未封住。曾跌停/蓝色细K线:红字"撬",跌停被打开。

q125500612的博客 2144

【JAVA】去掉 if...else 的七种绝佳之法...

我相信小伙伴一定看过多篇怎么去掉 if…else 的文章,也知道大家都很有心得,知道多种方法来去掉 if…else ,比如 Option,策略模式等等,但我相信这篇文章绝对是最全,最完备怎么去掉 if…else 的文章,里面有些方法我相信有小伙伴肯定不知道,我也不卖关子,直接进入主题,如何干掉 if…else。

DreamSun的博客 3279

3D-IC测试挑战与Tessent解决方案解析

3D-IC技术通过硅通孔(TSV)实现芯片垂直堆叠,是延续摩尔定律的关键路径。该技术面临三大核心挑战:KGD标准严苛化要求测试覆盖率达99.5%以上,存储器测试需兼容LPDDR/HBM等多种协议,逻辑堆叠需解决TSV互连的电气特性和时序验证问题。Mentor Tessent平台采用混合测试架构,结合压缩扫描测试(ATPG)和内建自测试(BIST)技术,实现100x测试数据压缩比和99.97%的TSV缺陷检出率。这些创新方案在移动SoC和高性能计算芯片中已获验证,测试时间缩短73%,缺陷逃逸率降低77%。随着

weixin_30621711的博客 376

去掉满屏if语句,让代码干净清爽

当你看到满屏得if,是不是感觉天旋地转,怀疑人生,其实我们在编写 Java 代码时,有几种方法是可以减少 if 语句的使用,提高代码的可读性和可维护性。

yuanchengfu0910的博客 2338

PDF与OFD电子发票解析技术实战:从格式转换到精准识别

本文深入探讨了PDF与OFD电子发票解析技术的实战应用,从格式转换到精准识别,提供了全面的解决方案。通过OFD转PDF技术、动态定位算法和多重校验机制,显著提升电子发票识别效率与准确率,助力企业财务数字化转型。

weixin_42565652的博客 167

使用SpringBoot+Vue3开发项目(1)---- 设计用户注册和登录的接口及页面

本文基于黑马大事件项目介绍如何使用SpringBoot+Vue3来实现前后端联调的登录与注册操作。

记得开心一点嘛的博客 3644

在Java中去掉 if...else 的七种绝佳之法

在Java编程中,if…else语句是一种常见的控制流结构,用于根据条件执行不同的代码路径。else语句可能会使代码变得难以阅读和维护。幸运的是,Java提供了一些其他方法来替代if…else,从而使代码更加简洁和易读。本文将介绍七种在Java中去掉if…在Java中,使用if…else语句是处理条件逻辑的常见方法,但过度使用会使代码变得复杂和难以维护。本文介绍的七种方法可以帮助我们避免使用if…else,使代码更加简洁和易读。在实际开发中,我们应该根据具体的需求和场景,选择合适的方法来替代if…

csbysj2020 1613

大话西游2单机版V8一键架设教程:5分钟搞定GM权限和仙玉修改(附完整物品代码表)

本文详细讲解了大话西游2单机版V8的一键架设教程,包括5分钟快速配置GM权限、仙玉修改及物品代码使用技巧。通过分步指导和服务端配置详解,帮助玩家轻松掌握游戏管理功能,重温经典回合制体验。附完整物品代码表,助你快速获取稀有道具和神兽。

weixin_42557830的博客 1239

聊聊java中一些减少if else 的编码习惯

前言 前段时间在阅读别人所写的代码的时候 , 发现其中一些业务相关的方法体内 , 出现了比较多的if-else语句多层嵌套的情况 . 首先我个人不是不提倡写if-else语句 , 不得不说 , 很多时候 , 在写某些逻辑 使用if-else 去做判断 , 代码看起来还是十分直观的 , 但是如果滥用if-else , 形成多层嵌套或者形成, 其中每个case 还包含了大量的逻辑 , 此时从可读性...

wanghao112956的博客 3319

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1126

三维Copula建模进阶:从对称、嵌套到Pair-Copula(C-Vine/D-Vine)到底怎么选?

本文深入探讨三维Copula建模的进阶策略,包括对称Archimedean、嵌套结构和Vine Copula(C-Vine/D-Vine)的选择方法。通过对比数学特性、计算复杂度和实际应用案例,提供了一套针对金融风险分析等场景的决策框架,帮助分析师根据数据特征选择最优模型。

weixin_27038701的博客 438

文件魔数校验:从原理到Java实战,构建安全文件上传防线

在Web开发与文件处理中,文件类型校验是保障系统安全与功能稳定的基础环节。其核心原理在于识别文件的真实格式,而非仅依赖用户可轻易修改的后缀名。文件魔数(Magic Number)作为嵌入文件头部的一组特定字节序列,如同文件的“数字指纹”,能够唯一标识其真实格式,例如JPEG文件以`FF D8`开头,PDF文件以`%PDF`开头。这项技术的核心价值在于显著提升校验的可靠性,有效防御通过伪造后缀名进行的攻击,是构建健壮文件上传功能的关键。其典型应用场景包括用户头像上传、文档处理系统以及任何需要接收并处理用户文件

weixin_30236595的博客 429

这可是全网网工数通方向学习路线最完整,最详细的版本,没有之一

文章篇幅较长,耐心看完你一定有所收获。

最铁头的网工博客 2万+

C++模板与string类:从泛型编程到字符串处理实战

泛型编程是现代C++的核心范式之一,它通过模板技术实现了代码的通用性和复用性。模板作为编译期的代码生成器,允许开发者编写与数据类型无关的算法和容器,显著提升了代码的抽象层次和可维护性。在工程实践中,这种技术价值体现在构建可复用的组件库和避免硬编码的重复逻辑上。std::string作为STL中最常用的组件之一,封装了字符串的底层内存管理,提供了安全高效的操作接口,广泛应用于文本处理、数据解析和系统编程等场景。本文结合函数模板、类模板的实例,深入探讨了string类的创建、增删改查、性能优化及常见陷阱,并展示

weixin_34268579的博客 261

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java 如何避免代码中大量的 if else 判断

我们可以将各个分支的逻辑封装成不同的策略类,然后通过一个上下文类来根据条件选择合适的策略对象执行相应的逻辑。在 Java 中,策略模式通常被应用于业务逻辑中,用于处理不同的业务场景和业务规则。,它通过定义一个工厂类来封装对象的创建过程,从而将客户端代码与具体的产品实现解耦。(1)定义一个 car 接口或抽象类,用于封装 car 的通用接口或抽象父类。(4)在业务逻辑中,调用工厂类的静态方法,创建对应的产品对象。(2)定义多个具体的策略类,实现该接口或抽象类。(3)工厂类,统一调度,用来管理这些策略

m0_58680865的博客 2914

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

消除业务代码中if....else的五种方式

消费业务代码中if...else的五种方式

自律使我自由 1911

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python优化if/else

在任何语言中,if/else都是常见的编程语法,而且因为python中没有switch/case,所以if/else使用频率就会更高。但是当if/else判断分支比较多,而且业务逻辑比较复杂的时候,整体代码就会显得非常臃肿。例如,下面根据不同手机品牌添加对应不同处理逻辑的程序,如果有新的手机品牌,就要不断的写elif分支。对于这种情况有没有更加优雅的写法呢?

haveanybody的博客 1663

在代码中精简IF-ELSE的方法

在代码中精简IF-ELSE的方法

m0_55337678的博客 661

if过多,if--else过多 ,if--else嵌套过多,优化代码质量

常用优化if -else系列 优化代码质量

qq_36255346的博客 5796

Go 程序里 if else 分支太多?试着用策略模式治理一下吧

本次跟大家分享的是策略模式,是一个可以减少我们在程序流程里不停堆叠 if else 的一个好办法,大家一起学一下吧。大家好,我是每周在这里陪你一起进步的网管。上篇文章我给大家分享了设计模式中的模版模式,给大家讲了用模版模式在项目开发时提炼流程、减少重复开发的技巧。同时,在上一篇文章我也分享了我总结的一个暴论,那就是“模板、策略和职责链三个设计模式是解决业务系统流程复杂多变这个痛点的利器”。今天我们...

slphahaha的博客 372
上一篇: 面试官:服务器安装JDK还是JRE?可以只安装JRE吗?
下一篇: Redis中设置了过期时间的Key,有哪些需要注意的事项?
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值