首页 > 编程语言 >[Java]多个参数的非空判断,不要再使用多个if挨个判断了!(多参数非空判断技巧)

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

时间:2024-10-09 11:23:06浏览次数:1  
标签:非空 判断 isAnyBlank cs 参数 为空 CharSequence 字符串 StringUtils

先上示例代码:

        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 = "[email protected]";
        String to = "";
        String subject = "Test Subject";
        String content = " ";

        if (StringUtils.isAnyBlank(form, to, subject, content)) {
            System.out.println("发送人,接收人,主题,内容均不可为空");
        } else {
            System.out.println("所有字段都已正确填写");
        }
    }
}

解释

在这个示例中:

  • form"[email protected]",不为空且不只包含空白字符。
  • 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,因为它可以减少代码的冗余性和提高可读性。

标签:非空,判断,isAnyBlank,cs,参数,为空,CharSequence,字符串,StringUtils
From: https://www.cnblogs.com/mllt/p/18453864/java-string-isEmpty

相关文章

  • 对UVM添加超时前的打印信息+AXI低功耗接口+process的await语句+对象当成参数+sv的单例
    对UVM添加超时前的打印信息首先获取到UVM的超时值,然后手动设定\$time的比较和while延时循环,当超出时间后,打印特殊的debug信息。$time<set_time,则进行循环。uvm_cmdline_processorclp;clp=uvm_cmdline_processor::get_inst();stringtimeout_settings[$];stringtimeout......
  • 函数和参数
    1.简介    函数,相信大家在数学领域中早已或多或少地对函数有了一些了解和学习,与数学领域不同,在c语言中将函数定义为完成特定任务的独立程序代码单元。2.函数的作用     为什么要使用函数呢?首先,使用函数可以省去编写重复代码的苦差,如果程序要多次完成某项任......
  • 【MYSQL】MYSQL约束-----非空约束(not null)和唯一约束(unique)
    1、概念MYSQL非空约束(notnull),指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库就会报错。注意:非空约束一张表中可以有多个。2、语法方式1:在创建表时指定(常用)<字段名><数据类型>not null例如:create table  t_user(i......
  • C++——有一个Date类,私有成员:月、日、年,公有成员:函数,其作用输出月/日/年,一个构造函数
    没注释的源代码#include<iostream>usingnamespacestd;classDate{private:  intmonth;  intday;  intyear;public:  voiddisplay()  {    cout<<month<<"/"<<day<<"/"<<year<<endl;......
  • C++——有Date类,私有成员:月日年,公有成员:函数,其作用输出月日年。一个构造函数有三个参
    没注释的源代码#include<iostream>usingnamespacestd;classDate{private:  intmonth;  intday;  intyear;public:  voiddisplay()  {    cout<<month<<"/"<<day<<"/"<<year<<endl;......
  • std::bind--改变函数参数的局限
    std::bind是C++标准库中的一个工具,用于将函数对象与部分参数绑定在一起,生成一个新的可调用对象。这使得函数的参数可以被部分或全部提前指定,从而得到一个参数更少甚至无参数的函数对象。在某些情况下,它可以用来延迟执行函数、简化函数调用,或在需要无参函数对象的场景中使用(如线......
  • C# WebService返回参数为DataTable报错“XML文档有错误”
    该问题由于DataTable列存在自定义类型。解决该报错需要以下几步:1、自定义类型增加xml序列化2、由于C#从XML反序列化DataSet或DataTable时的默认限制,所以需要先把调用方的项目开放限制,如果是.netframework项目,需要在app.config中添加<configuration><runtime>......
  • std::packaged_task<返回类型(参数类型)>
    std::packaged_task概述std::packaged_task是C++11引入的标准库模板类,用于包装一个可调用对象(如函数、lambda表达式、函数对象等),使其能够与std::future协同工作。简单来说,它将一个任务(可调用对象)包装起来,并允许你获取该任务的执行结果,这样你可以在一个线程中执行任务,并在......
  • c++可变模板参数
    在C++中的可变模板参数使用省略号...来表示一个参数包(ParameterPack),其具体位置决定了这个包是模板参数包还是函数参数包,以及如何进行参数展开。1.模板参数包:c...Args省略号放在类型名称的右边,用来表示模板参数包,即可以接受任意数量的模板类型参数。template<typename...A......
  • java_day9_包的划分、形式参数、返回值、修饰符、内部类、匿名内部类
    一、包包的划分好处:1、方便管理我们的代码文件2、不同包下的文件名可以是一样的常见的包命名规则:1、按照功能划分增加-学生增加-老师增加删除-学生删除-老师删除修改......