先上示例代码:

        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 只包含空白字符。

使用场景

  1. 表单验证: 在处理表单提交时,确保所有必填字段都已填写。
  2. 参数校验: 在方法调用前,确保传入的参数不为空。
  3. 数据清洗: 在处理数据前,确保数据字段有效。

相关方法

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

性能分析

  1. 数组检查

    • ArrayUtils.isEmpty(css):这是一个简单的数组长度检查,时间复杂度为 O(1)。
  2. 遍历数组

    • for (final CharSequence cs : css):遍历数组,时间复杂度为 O(n),其中 n 是数组的长度。
  3. 字符串检查

    • 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()) {
// 处理错误
}

性能对比

  1. 代码简洁性

    • StringUtils.isAnyBlank 更加简洁,易于阅读和维护。
    • 手动编写多个 if 语句会增加代码的冗余性和复杂性。
  2. 性能开销

    • StringUtils.isAnyBlank 的时间复杂度为 O(n * m),其中 n 是字符串数组的长度,m 是最长字符串的长度。
    • 手动编写多个 if 语句的时间复杂度也为 O(n * m),因为每个字符串都需要单独检查。
  3. 短路机制

    • StringUtils.isAnyBlank 和手动编写多个 if 语句都具有短路机制,即一旦发现某个字符串为空或仅包含空白字符,就会立即返回 true,不会继续检查剩余的字符串。
  4. 额外开销

    • StringUtils.isAnyBlank 可能会有少量的函数调用开销,但这种开销通常可以忽略不计。
    • 手动编写多个 if 语句可能会导致更多的代码行数和潜在的错误点。

结论

总体来说,StringUtils.isAnyBlank 在性能上与手动编写多个 if 语句相当,但在代码简洁性和可维护性方面更具优势。除非你有非常严格的性能要求,否则推荐使用 StringUtils.isAnyBlank,因为它可以减少代码的冗余性和提高可读性。

[Java]多个参数的非空判断,不要再使用多个if挨个判断了!(多参数非空判断技巧)的更多相关文章

  1. 【转】const 是左结合的,若左边为空,则再向右结合

    const 是左结合的,若左边为空,则再向右结合 一.指向  const  对象的指针指向  const  对象的指针,指的是指针指向的对象的内容是const的,不可修改,但指针本身(即指针的值)是可 ...

  2. JS的数据类型判断函数、数组对象结构处理、日期转换函数,浏览器类型判断函数合集

    工具地址:https://github.com/BothEyes1993/bes-jstools bes-jstools 100多个基础常用JS函数和各种数据转换处理集合大全,此工具包是在 outil ...

  3. 如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断。

    如果是在有master上开启了该参数,记得在slave端也要开启这个参数(salve需要stop后再重新start),否则在master上创建函数会导致replaction中断.

  4. 获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1

    获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1

  5. 太深了,梯度传不下去,于是有了highway。 干脆连highway的参数都不要,直接变残差,于是有了ResNet。 强行稳定参数的均值和方差,于是有了BatchNorm。RNN梯度不稳定,于是加几个通路和门控,于是有了LSTM。 LSTM简化一下,有了GRU。

    请简述神经网络的发展史sigmoid会饱和,造成梯度消失.于是有了ReLU.ReLU负半轴是死区,造成梯度变0.于是有了LeakyReLU,PReLU.强调梯度和权值分布的稳定性,由此有了ELU,以及 ...

  6. 后端model传入前端JSP页面中的值判断后再取值

    所遇到的问题后端model传入前端JSP页面中的值通过foreach循环内要满足条件才能取值给Div中,我们知道jsp页面中可以直接用EL表达式取值,格式就是${"model中传来的数据&q ...

  7. vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象合并到总的对象,再提交

    vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象 ...

  8. [转帖]再谈IO的异步,同步,阻塞和非阻塞

    再谈IO的异步,同步,阻塞和非阻塞 https://yq.aliyun.com/articles/53674?spm=a2c4e.11155435.0.0.48bfe8efHUE8wg   krypt ...

  9. 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); ...

  10. 在JS中如何判断所输入的是一个数、整数、正数、非数值?

    1.判断是否为一个数字: Number(num)不为 NaN,说明为数字 2. 判断一个数为正数: var num=prompt("请输入:"); if(Number(num)&g ...

随机推荐

  1. /proc/pids/maps

    本实例中的用户空间地址从 0x00000000 到 0x80000000,从地址空间划分可知,从低到高依次是: 可执行文件的代码段.数据段.BSS段. 堆heap. 文件映射和匿名映射,包括vdso. ...

  2. 活动预告 | 中国数据库联盟(ACDU)中国行第四站定档西安,邀您探讨数据库前沿技术

    作为墨天轮社区与中国数据库联盟的品牌活动之一,[ACDU 中国行]已走过深圳.杭州.成都三大城市,在线下汇集数据库领域的行业知名人士,共同探讨数据库前沿技术及其应用,促进行业发展和创新,同时也为开发者 ...

  3. 在 Ubuntu 22.04 上安装 KubeSphere 实战教程

    作者:老 Z,中电信数智科技有限公司山东分公司运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes.KubeSphere.DevOps.OpenStack.Ans ...

  4. 图菱科技 SaaS 系统容器化最佳实践

    大家好,我是龚承明,在图菱(成都)科技有限公司任职,主要负责公司的产品系统研发以及公司IT基础设施的建设工作.本篇文章将为大家介绍下我司在采用 KubeSphere 平台实现公司业务系统容器化过程中的 ...

  5. KubeSphere 使用 OpenLDAP 进行统一认证完全指南

    作者:申红磊,青云QingCloud 容器解决方案架构师,开源项目爱好者,KubeSphere Member. 背景 在实际使用中,会有一些用户,在不同场景中经常碰到 OpenLDAP 对接问题: 能 ...

  6. curl命令详解【转载】

    本文转载自curl 的用法指南-阮一峰 简介 curl 是常用的命令行工具,用来请求 Web 服务器.它的名字就是客户端(client)的 URL 工具的意思. 它的功能非常强大,命令行参数多达几十种 ...

  7. 使用VSCode进行WSL2的本机调试

    首先我们需要安装Remote Development插件(这个Remote-WSL一定要保证是装上的哦). 然后我们先连接到WSL. (第一次进入远程模式,会慢一些,需要下载一些组件) (如果你打开这 ...

  8. 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现七

    一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...

  9. 2024 AH CSP-S 迷惑行为大赏

    洛谷专栏阅读:https://www.luogu.com.cn/article/0atx674s 一.概述 观前提示:本届CSP-S安徽省整活相较于其他省份不是那么"群英荟萃",观 ...

  10. 16.Kubernetes集群资源监控

    Kubernetes集群资源监控 概述 监控指标 一个好的系统,主要监控以下内容 集群监控 节点资源利用率 节点数 运行Pods Pod监控 容器指标 应用程序[程序占用多少CPU.内存] 监控平台 ...