[Java]多个参数的非空判断,不要再使用多个if挨个判断了!(多参数非空判断技巧)
先上示例代码:
if (StringUtils.isAnyBlank(form, to, subject, content)) {
log.error("发送人,接收人,主题,内容均不可为空");
return ResponseResult.error("发送人,接收人,主题,内容均不可为空")
}
StringUtils.isAnyBlank
是 Apache Commons Lang 库中的一个工具方法,用于检查多个字符串中是否有任何一个为空或仅包含空白字符。这个方法非常实用,特别是在需要验证多个输入字段是否为空的场景中。
方法签名
public static boolean isAnyBlank(CharSequence... css)
参数
css
: 一个可变参数列表,包含一个或多个CharSequence
类型的对象。CharSequence
是一个接口,String
类实现了这个接口,所以你可以传入String
对象。
返回值
true
: 如果任何一个字符串为空或仅包含空白字符。false
: 如果所有字符串都不为空且不只包含空白字符。
示例
import org.apache.commons.lang3.StringUtils;
public class Example {
public static void main(String[] args) {
String form = "sender@example.com";
String to = "";
String subject = "Test Subject";
String content = " ";
if (StringUtils.isAnyBlank(form, to, subject, content)) {
System.out.println("发送人,接收人,主题,内容均不可为空");
} else {
System.out.println("所有字段都已正确填写");
}
}
}
解释
在这个示例中:
form
是"sender@example.com"
,不为空且不只包含空白字符。to
是""
,是一个空字符串。subject
是"Test Subject"
,不为空且不只包含空白字符。content
是" "
,只包含一个空白字符。
调用 StringUtils.isAnyBlank(form, to, subject, content)
会返回 true
,因为 to
是空字符串,content
只包含空白字符。
使用场景
- 表单验证: 在处理表单提交时,确保所有必填字段都已填写。
- 参数校验: 在方法调用前,确保传入的参数不为空。
- 数据清洗: 在处理数据前,确保数据字段有效。
相关方法
StringUtils.isBlank(CharSequence cs)
: 检查单个字符串是否为空或仅包含空白字符。StringUtils.isEmpty(CharSequence cs)
: 检查单个字符串是否为空。StringUtils.isNoneBlank(CharSequence... css)
: 检查多个字符串是否都不为空且不只包含空白字符。StringUtils.isNoneEmpty(CharSequence... css)
: 检查多个字符串是否都不为空。
总结
StringUtils.isAnyBlank
是一个非常方便的方法,用于快速检查多个字符串中是否有任何一个为空或仅包含空白字符。它可以帮助你在早期阶段捕获输入错误,提高代码的健壮性和可维护性。
StringUtils.isAnyBlank 和 写多个if来判断对比
StringUtils.isAnyBlank
方法的性能通常是非常高效的,因为它是由经验丰富的开发者编写的,并且经过了广泛的测试和优化。不过,了解其内部实现可以帮助我们更好地理解它的性能特性。
StringUtils.isAnyBlank
的内部实现
StringUtils.isAnyBlank
方法的内部实现大致如下:
public static boolean isAnyBlank(final CharSequence... css) {
if (ArrayUtils.isEmpty(css)) {
return false;
}
for (final CharSequence cs : css) {
if (isBlank(cs)) {
return true;
}
}
return false;
}
public static boolean isBlank(final CharSequence cs) {
int strLen;
if (cs == null || (strLen = cs.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
性能分析
数组检查:
ArrayUtils.isEmpty(css)
:这是一个简单的数组长度检查,时间复杂度为 O(1)。
遍历数组:
for (final CharSequence cs : css)
:遍历数组,时间复杂度为 O(n),其中 n 是数组的长度。
字符串检查:
isBlank(cs)
:对于每个字符串,首先检查是否为null
或长度为 0,时间复杂度为 O(1)。- 如果字符串不为空,再逐字符检查是否为空白字符,时间复杂度为 O(m),其中 m 是字符串的长度。
与多个 if
语句的比较
假设我们手动编写多个 if
语句来检查多个字符串是否为空或仅包含空白字符:
if (form == null || form.trim().isEmpty() ||
to == null || to.trim().isEmpty() ||
subject == null || subject.trim().isEmpty() ||
content == null || content.trim().isEmpty()) {
// 处理错误
}
性能对比
代码简洁性:
StringUtils.isAnyBlank
更加简洁,易于阅读和维护。- 手动编写多个
if
语句会增加代码的冗余性和复杂性。
性能开销:
StringUtils.isAnyBlank
的时间复杂度为 O(n * m),其中 n 是字符串数组的长度,m 是最长字符串的长度。- 手动编写多个
if
语句的时间复杂度也为 O(n * m),因为每个字符串都需要单独检查。
短路机制:
StringUtils.isAnyBlank
和手动编写多个if
语句都具有短路机制,即一旦发现某个字符串为空或仅包含空白字符,就会立即返回true
,不会继续检查剩余的字符串。
额外开销:
StringUtils.isAnyBlank
可能会有少量的函数调用开销,但这种开销通常可以忽略不计。- 手动编写多个
if
语句可能会导致更多的代码行数和潜在的错误点。
结论
总体来说,StringUtils.isAnyBlank
在性能上与手动编写多个 if
语句相当,但在代码简洁性和可维护性方面更具优势。除非你有非常严格的性能要求,否则推荐使用 StringUtils.isAnyBlank
,因为它可以减少代码的冗余性和提高可读性。
[Java]多个参数的非空判断,不要再使用多个if挨个判断了!(多参数非空判断技巧)的更多相关文章
- 【转】const 是左结合的,若左边为空,则再向右结合
const 是左结合的,若左边为空,则再向右结合 一.指向 const 对象的指针指向 const 对象的指针,指的是指针指向的对象的内容是const的,不可修改,但指针本身(即指针的值)是可 ...
- JS的数据类型判断函数、数组对象结构处理、日期转换函数,浏览器类型判断函数合集
工具地址:https://github.com/BothEyes1993/bes-jstools bes-jstools 100多个基础常用JS函数和各种数据转换处理集合大全,此工具包是在 outil ...
- 如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断。
如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断.
- 获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1
获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1
- 太深了,梯度传不下去,于是有了highway。 干脆连highway的参数都不要,直接变残差,于是有了ResNet。 强行稳定参数的均值和方差,于是有了BatchNorm。RNN梯度不稳定,于是加几个通路和门控,于是有了LSTM。 LSTM简化一下,有了GRU。
请简述神经网络的发展史sigmoid会饱和,造成梯度消失.于是有了ReLU.ReLU负半轴是死区,造成梯度变0.于是有了LeakyReLU,PReLU.强调梯度和权值分布的稳定性,由此有了ELU,以及 ...
- 后端model传入前端JSP页面中的值判断后再取值
所遇到的问题后端model传入前端JSP页面中的值通过foreach循环内要满足条件才能取值给Div中,我们知道jsp页面中可以直接用EL表达式取值,格式就是${"model中传来的数据&q ...
- vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象合并到总的对象,再提交
vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象 ...
- [转帖]再谈IO的异步,同步,阻塞和非阻塞
再谈IO的异步,同步,阻塞和非阻塞 https://yq.aliyun.com/articles/53674?spm=a2c4e.11155435.0.0.48bfe8efHUE8wg krypt ...
- Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与
Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...
- 在JS中如何判断所输入的是一个数、整数、正数、非数值?
1.判断是否为一个数字: Number(num)不为 NaN,说明为数字 2. 判断一个数为正数: var num=prompt("请输入:"); if(Number(num)&g ...
随机推荐
- const` 关键字位于函数签名的末尾
在 C++ 中,const 关键字可以应用于成员函数,表示该函数不会修改对象的成员变量. const 出现在 operator->() 成员函数的末尾,这意味着该成员函数在调用时不会修改对象的任 ...
- 自定义指令 v-imgerror 当图片的 src 资源 无效 就替换 默认的 src 显示图片
// 回顾自定义指令 // 作用 : 自定义一些对dom操作的快捷指令 // 前提:指令就是用来操作 dom (v-if /v-show/v-for ....) // 语法:Vue.directive ...
- Linux+PXE+DHCP+TFTP+NFS实现无人值守安装
一.实验环境:OS:Redhat6.4软件:DHCP服务.TFTP服务.NFS服务硬件:Dell R630服务器两台物理连接图: em1 em1 二.工作原理:服务器通过PXE网卡启动,从dhcp服务 ...
- Machine Learning Week_1 Model and Cost Function 1-4
目录 2 Model and Cost Function 2.1 Video: Model Representation unfamiliar words 2.2 Reading: Model Rep ...
- SpringBoot数据访问,配置数据源
配置文件目录 配置数据源jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...
- Graphische Datenverarbeitung Ⅰ 学习笔记
1. Pipeline 1.1 Graphische Primitive 1.2 Model and View Transform 1.3 Vertex Shading 1.4 Clipping 1. ...
- selenium3环境搭建,Firefox与对应的geckodriver, chrome与对应的Chromedriver
Firefox与对应的geckodriver 火狐下载:http://ftp.mozilla.org/pub/firefox/releases/ geckodriver下载:https://githu ...
- awk优化钉钉通知测试报告
一.背景 在之前的博客 Go服务自动触发单元测试覆盖率 中钉钉通知的效果实现如下图: 最近RD提出对本次和上次覆盖率的比对需求,并把比对结果也显示在钉钉通知上. 二.实现思路 要实现数据比对,就需要对 ...
- 题解:洛谷P3745 期末考试(整数三分)
题解:洛谷P3745 期末考试(整数三分) 题目传送门 题目大意:给出 \(n\) 个同学期望出成绩的时间限制 \(a_i\) 和 \(m\) 个学科公布成绩的初始时间 \(t_i\) ,1个同学每多 ...
- cnblogs内容同步到51cto上的说明(声明)
51CTO网站上的blog地址为:https://blog.51cto.com/u_15642578 该地址是个人在博客园cnblogs上的同步账号(https://cnblogs.com/xyz), ...