Apache Commons Lang3 中的 `isNotEmpty` 与 `isNotBlank`的区别
前言
在 Java 开发中,字符串的空值(null)、空字符串(“”)和空白字符串(如 " ")的判断是高频需求。Apache Commons Lang3 的 StringUtils
类提供了两个核心方法:isNotEmpty
和 isNotBlank
,它们在功能上看似相似,但实际使用场景和逻辑存在显著差异。
核心区别
1. isNotEmpty
方法
- 定义:
判断字符串是否为 非空且长度大于 0,允许包含空白字符。public static boolean isNotEmpty(String str) {return (str != null && !str.isEmpty()); }
- 逻辑条件:
str != null
且str.length() > 0
。 - 适用场景:
需要确保字符串不为null
或空字符串,但允许用户输入空白字符(如" "
)。
2. isNotBlank
方法
- 定义:
判断字符串是否为 非空、长度大于 0,且至少包含一个非空白字符(如字母、数字、符号等)。public static boolean isNotBlank(String str) {int strLen;if (str == null || (strLen = str.length()) == 0) {return false;}for (int i = 0; i < strLen; i++) {if (!Character.isWhitespace(str.charAt(i))) {return true;}}return false; }
- 逻辑条件:
str != null
且str.trim().length() > 0
。 - 适用场景:
需要严格排除空白字符串(如用户输入验证),确保内容有意义。
3. 对比表格
方法 | 判断条件 | 空白字符串(如 " " )的结果 | 空字符串("" )的结果 | null 的结果 |
---|---|---|---|---|
isNotEmpty | 非 null 且长度 > 0(允许空白字符) | true (长度 > 0) | false | false |
isNotBlank | 非 null 且长度 > 0,且至少一个非空白字符 | false (全是空白) | false | false |
使用场景与最佳实践
1. isNotEmpty
的典型场景
- 允许空白字符的输入:
如某些格式化输入(如用户输入" 123 "
,需保留前导/尾随空格)。 - 非严格验证:
如日志记录或非关键字段的空值检查。
示例代码:
// 允许空白字符的输入
if (StringUtils.isNotEmpty(input)) {process(input); // 处理包含空白的字符串
}
2. isNotBlank
的典型场景
- 严格验证用户输入:
如用户名、密码、邮箱等字段,需确保内容非空且非空白。 - 避免逻辑漏洞:
防止用户通过输入空格绕过验证(如" "
被误认为有效)。
示例代码:
// 用户注册时的姓名验证
if (StringUtils.isNotBlank(name)) {saveUser(name); // 仅接受有意义的输入
} else {throw new IllegalArgumentException("姓名不能为空或空白");
}
代码示例:直观对比结果
import org.apache.commons.lang3.StringUtils;public class StringValidatorExample {public static void main(String[] args) {// 测试用例test("", "空字符串");test(" ", "空白字符串");test("Hello", "有效字符串");test(null, "null");}private static void test(String input, String description) {System.out.println("输入: " + input + "(" + description + ")");System.out.println("isNotEmpty: " + StringUtils.isNotEmpty(input));System.out.println("isNotBlank: " + StringUtils.isNotBlank(input));System.out.println("-----------------------------");}
}// 输出结果:
// 输入: (空字符串)
// isNotEmpty: false
// isNotBlank: false
// -----------------------------
// 输入: (空白字符串)
// isNotEmpty: true
// isNotBlank: false
// -----------------------------
// 输入: Hello(有效字符串)
// isNotEmpty: true
// isNotBlank: true
// -----------------------------
// 输入: null(null)
// isNotEmpty: false
// isNotBlank: false
方法 | 允许空白字符 | 适用场景 | 示例输入 | 结果 |
---|---|---|---|---|
isNotEmpty | 是 | 需保留空白字符的非空检查 | " " , "abc" | true |
isNotBlank | 否 | 严格验证非空且内容有意义 | " " , "abc" | false , true |
依赖配置与注意事项
1. 依赖添加
Maven:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> <!-- 使用最新版本 -->
</dependency>
Gradle:
implementation 'org.apache.commons:commons-lang3:3.12.0'
2. 注意事项
- 性能优化:
isNotBlank
内部会遍历字符串检查非空白字符,若输入极长,需权衡性能与需求。 - 避免重复判断:
若需同时判断null
和空白,直接使用isNotBlank
即可。 - 与
String.isEmpty()
的区别:
StringUtils.isEmpty(str)
等价于str == null || str.isEmpty()
,但String.isEmpty()
仅适用于非null
的字符串。
最佳实践
1. 依赖管理
<!-- Maven 依赖 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>
2. 代码风格
- 使用 静态导入(
import static
)简化代码:import static org.apache.commons.lang3.StringUtils.*; // 直接调用 isNotBlank(str) 而非 StringUtils.isNotBlank(str)
- 避免重复逻辑:优先使用
StringUtils
替代手动实现的null
和空字符串检查。 - 异常处理:在关键路径上结合
isNotBlank
抛出IllegalArgumentException
。 - 防御性编程:
对于可能为null
的输入,始终优先使用StringUtils
的安全方法(如defaultString(str, "default")
)。
3. 性能优化
- 避免多次调用:若需多次检查同一字符串,建议缓存结果:
String input = ...; boolean isInputValid = StringUtils.isNotBlank(input); if (isInputValid) {// 多次使用 isInputValid 而非重复调用 }
总结
isNotBlank
是更安全的选择:
在 90% 的业务场景(如用户输入验证)中,推荐使用isNotBlank
,因为它能彻底排除空白输入。isNotEmpty
的适用场景有限:
仅当需要保留空白字符(如特殊格式输入)时使用。- 编码规范建议(仅示例):
在代码中明确标注判断逻辑,例如:// 验证用户输入是否有效(非空且非空白) if (!StringUtils.isNotBlank(input)) {throw new IllegalArgumentException("输入无效"); }
需求 | 推荐方法 | 关键点 |
---|---|---|
需要保留空白字符(如格式化) | isNotEmpty | 允许 " " 通过 |
严格验证非空白内容 | isNotBlank | 必须包含至少一个非空白字符(如 "abc" ) |
检查是否为 null 或空字符串 | StringUtils.isEmpty | 等价于 !isNotEmpty |
扩展阅读
- Apache Commons Lang 官方文档:
Apache Commons Lang3 Documentation - 相似方法对比:
StringUtils.isEmpty
:判断字符串是否为空或null
。StringUtils.isNotBlank
:等价于!StringUtils.isBlank
,检查字符串是否为空或全空白。
StringUtils.defaultIfBlank
:返回非空且非空白的字符串,否则返回默认值。StringUtils.trimToEmpty
:将null
或空白字符串转换为空字符串""
。
相关文章:
Apache Commons Lang3 中的 `isNotEmpty` 与 `isNotBlank`的区别
前言 在 Java 开发中,字符串的空值(null)、空字符串(“”)和空白字符串(如 " ")的判断是高频需求。Apache Commons Lang3 的 StringUtils 类提供了两个核心方法:isNotEmp…...
WPF 登录页面
效果 项目结构 LoginWindow.xaml <Window x:Class"PrismWpfApp.Views.LoginWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.…...
CExercise_05_1函数_2海伦公式求三角形面积
题目: 键盘录入三个边长(带小数),然后用海伦公式计算三角形的面积(如果它确实是一个三角形的话) 海伦公式求三角形面积: 要求基于下列两个函数完成这个编程题: // 判断abc是否可以组…...
Muduo网络库实现 [十五] - HttpContext模块
目录 设计思路 类的设计 解码过程 模块的实现 私有接口 请求函数 解析函数 公有接口 疑惑点 设计思路 记录每一次请求处理的进度,便于下一次处理。 上下文模块是Http协议模块中最重要的一个模块,他需要记录每一次请求处理的进度,需…...
构建自己的私有 Git 服务器:基于 Gitea 的轻量化部署实战指南
对于个人开发者、小型团队乃至企业来说,将项目代码托管在 GitHub、Gitee 等公共平台虽然方便,但也存在一定的隐私与可控性问题。 搭建一套私有 Git 代码仓库系统,可以实现对源码的完全控制,同时不依赖任何第三方平台,…...
【计科】计算机科学与技术,从离散数学到软件工程,从理学/抽象/科学到工学/具体/技术
【计科】计算机科学与技术,从离散数学到软件工程,从理学/抽象/科学到工学/具体/技术 文章目录 1、发展史与桥梁(离散数学 -> 算法/数据结构 -> 软件工程)2、离散数学(数理逻辑-命题/谓词/集合/函数/关系 -> 代…...
架构与大数据-RabbitMQ和Kafka的技术实现异同及落地场景上的异同
RabbitMQ与Kafka技术实现及场景对比 一、技术实现异同 对比维度RabbitMQKafka核心协议/模型基于 AMQP 协议,支持点对点、发布/订阅、Topic Exchange 等多种消息模式,支持灵活的路由规则基于 发布-订阅模型,…...
工程画图-UML类图 组合和聚合
组合VS聚合 组合&聚合浅层理解 组合似组装,电脑组装,少装一个CPU行不?不行,没CPU哪还是电脑啊。用实心菱形表示。 而聚合似起义,聚是一团火,散是满天星。就像公司和员工,少你一个照常运转…...
Go语言-初学者日记(七):用 Go 写一个 RESTful API 服务!
👷 实践是最好的学习方式!这一篇我们将用 Go Gin 框架从零开始开发一个用户管理 API 服务。你将学到: 如何初始化项目并引入依赖如何组织目录结构如何用 Gin 实现 RESTful 接口如何通过 curl 测试 API进阶功能拓展建议 🧰 一、项…...
数据结构:手工创建表达式树的方法
1. 表达式树 表达式树(Binary Expression Tree)是一类特殊的二叉树,用以表示表达式,如图 7.6.1 所示,是一棵表示了 a b * c d * (e f) 的表达式树。 图 7.6.1 表达式树示例 表达式树有如下特点: 操作数…...
自定义类型:联合和枚举
文章目录 前言一、联合体类型的声明1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的一个练习 二、枚举类型的声明2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用1. 用于 switch 语句2. 作为函数参数 总结 前…...
注意力机制
实现了Bahdanau式加法注意力的核心计算逻辑。以下是三个线性层设计的完整技术解析: 一、数学公式推导 注意力分数计算流程: s c o r e ( h d e c , h e n c ) v T ⋅ tanh ( W 1 ⋅ h e n c W 2 ⋅ h d e c ) score(h_{dec}, h_{enc}) v^T \cdot …...
OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)
1、先插好上电(可正确识别) 2、上电开机后插,报错如下,只能检测到USB2.0--480M,识别不到USB3.0-5Gbps,重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: reset high-speed…...
KubeVirt虚拟化管理架构
目录 一. KubeVirt简介 1.1 KubeVirt的价值 1.2 KubeVirt架构 1.3 KubeVirt组件 1.4 KubeVirt流程管理 KubeVirt实战 2.1 Kubevirt安装 2.1.1节点规划 2.1.2 环境准备 2.1.3 安装KubeVirt 2.1.4 安装CDI 2.1.5 安装virtctl命令工具 2.1.6 生成官方虚拟机 2.1.7 进…...
游戏引擎学习第202天
调试器:启用“跳转到定义/声明”功能 开始了一个完整游戏的开发过程,并分享了一些实用技巧。首先,讨论了如何在 Visual Studio 中使用“跳转到定义”和“跳转到声明”功能,但当前的项目并未启用这些功能,因为缺少浏览…...
sqlalchemy查询json
第一种:字段op是json格式: {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…...
2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、握手问题-(解析)-简单组合问题(别人叫她 鸽巢定理)😇,感觉叫高级了…...
Linux系统之wc命令的基本使用
Linux系统之wc命令的基本使用 一、命令简介二、基本语法格式三、核心功能选项四、典型使用案例4.1 创建示例文件4.2 基础统计操作4.3 组合选项使用4.4 管道流处理 五、高级应用技巧4.1 递归统计代码行数4.2 统计CSV文件数据量4.3 监控日志增长速率4.4 字符与字节差异说明 七、命…...
SQL Server 2022 脏读问题排查与思考
总结sqlserver的使用,总是会回想起很多开发过程当中加班努(拼)力(命)的场景,今天,就把之前一个由于数据库脏读到这的OA系统员工请假流程状态不一致问题和解决思路分享一下。 业务场景描述 由于…...
Linux系统时间
1. Linux系统时间 jiffies是linux内核中的一个全局变量,用来记录以内核的节拍时间为单位时间长度的一个数值。 jiffies变量开机时有一个基准值,然后内核每过一个节拍时间jiffies就会加1。 一个时间节拍的时间取决于操作系统的配置,Linux系统一…...
【Windows批处理】命令入门详解
Windows 批处理(Batch Script)是一种用于在 Windows 操作系统上自动执行命令的脚本语言。它基于 Windows 命令提示符(cmd.exe)并使用 .bat 或 .cmd 文件格式。 一、批处理基础 1. 创建批处理文件 批处理脚本本质上是一组按顺序执…...
fpga系列 HDL:ModelSim 条件断点调试 modelsim支持的tcl语言
条件断点调试配置流程: 触发动作用tcl语言描述,modelsim支持的tcl语言见:https://home.engineering.iastate.edu/~zzhang/courses/cpre581-f08/resources/modelsim_quickguide.pdf 运行效果:...
Linux: network: 两台直连的主机业务不通
前提环境,有一个产品的设定是两个主机之间必须是拿网线直连。但是设备管理者可能误将设置配错,不是直连。 最近遇到一个问题,说一个主机发的包,没有到对端,一开始怀疑设定的bond设备的问题,检查了bond的设置状态,发现没有问题,就感觉非常的奇怪。后来就开始怀疑两个主机…...
虚拟地址空间布局架构
一、内存管理架构 1.Linux内核整体架构以及子系统 内存管理子系统架构分为用户空间、内核空间及硬件部分 3 个层面: 用户空间:应用程序使用malloc()申请内存资源,通过free()释放内存资源。内核空间:内核是操作系统的一部分&…...
在VMware下Hadoop分布式集群环境的配置--基于Yarn模式的一个Master节点、两个Slaver(Worker)节点的配置
你遇到的大部分ubuntu中配置hadoop的问题这里都有解决方法!!!(近10000字) 概要 在Docker虚拟容器环境下,进行Hadoop-3.2.2分布式集群环境的配置与安装,完成基于Yarn模式的一个Master节点、两个…...
go day 01
go day 01 配置go环境 install go on D:\huang\lang\go\D:\huang\lang\go\bin\go xxx.go # D:\huang\lang\go\bin 设置到环境变量go go version# 创建任意一个目录,创建三个文件夹 # D:\huang\lang\goProject bin、pkg、src # 创建三个系统环境变量 GOROOT GOPATH GOBIN # GOR…...
(二)RestAPI 毛子(Tags)
文章目录 项目地址一、给Habit添加Tags1.1 创建Tags1. 创建一个新的HabitTags实体2. 设置Habit和Tags的关系3. 设置HabitTag表4. 在HabitConfiguration里配置5. 将表添加到EFCore里6. 迁移数据 1.2 给Habit增加/修改标签1. 创建UpsertHabitTagsDto2. 创建查询HabitWithTagsDto3…...
Elasticsearch:使用机器学习生成筛选器和分类标签
作者:来自 Elastic Andre Luiz 探索使用机器学习模型与传统硬编码方法在搜索体验中自动创建筛选器和分类标签的优缺点 筛选器和分类标签是用来优化搜索结果的机制,帮助用户更快速地找到相关内容或产品。在传统方法中,规则是手动定义的。例如…...
Python接口自动化测试之UnitTest详解
↵ 基本概念 UnitTest单元测试框架是受到JUnit的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 它分为四个部分test fixture、Te…...
《概率论与数理统计》期末复习笔记_上
目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…...
工程师 - Doxygen介绍
Code Documentation. Automated. Free, open source, cross-platform. Version 1.12.0 is now available! Release date: 7 August 2024 官方网址: Doxygen homepage 文档: Doxygen: Overview Github网址: https://github.com/doxygen/…...
开源且完全没有审核限制的大型语言模型的概述
开源且完全没有审核限制的大型语言模型的概述 关键要点 研究表明,存在多个开源的大型语言模型(LLM)完全没有审核限制,适合开放对话。包括基于 Llama、Mixtral、Phi-2 和 StableLM 的模型,参数范围从 2.78 亿到 4050 亿…...
Qt QTableView QAbstractTableModel实现复选框+代理实现单元格编辑
话不多说,直接看代码 一、Model 1、QTableModel_Test.h #pragma once#include <QAbstractTableModel> #include <QObject> #include <QModelIndex>class QTableModel_Test : public QAbstractTableModel {Q_OBJECT public:QTableModel_Test(Q…...
2025.3.19
1、用vim编辑/etc/hosts文件,将本机和第二个虚拟机的ip地址和主机名写入该文件,然后ping 两个主机的主机名能否ping通; (1)在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…...
GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议
蓝牙的 GATT(Generic Attribute Profile) 是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议,用于定义设备如何通过蓝牙进行数据传输和交互。GATT 是基于 ATT(Attribute Proto…...
打造下一代智能体验:交互型 AI 的崛起与实践
在人工智能技术不断飞跃的今天,我们正迎来一个从"一问一答"向"多轮交互、智能反馈"转变的新时代——交互型 AI(Interactive AI)。 什么是交互型 AI? 交互型 AI 指的是具备多轮对话能力、状态记忆、工具调用…...
关于uint8_t、uint16_t、uint32_t、uint64_t的区别与分析
一、类型定义与字节大小 uint8_t、uint16_t、uint32_t、uint64_t 是 C/C 中定义的无符号整数类型,通过 typedef 对基础类型起别名实现。位宽(bit)和字节数严格固定: uint8_t:8 位,占用 1 字节ÿ…...
19685 握手问题
19685 握手问题 ⭐️难度:简单 🌟考点:2024、省赛、数学 📖 📚 package test ;import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);…...
react redux的学习,单个reducer
redux系列文章目录 一 什么redux? redux是一个专门用于做状态管理的JS库(不是react插件库)。它可以用在react, angular, vue等项目中, 但基本与react配合使用。集中式管理react应用中多个组件共享的状 简单来说,就是存储页面的状态值的一个库…...
CCF GESP C++编程 二级认证真题 2025年3月
C 二级 2025 年 03 月 CCF GESP C编程 二级认证真题 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D C A A D A D A C B C D B C C 1 单选题 第 1 题 2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人&#…...
Lua函数与表+Lua子文件加载与元表
Lua函数相关示例代码 --脚本型语言,不能先调用,再定义,因为代码是从上往下执行的 --第一种声明函数 function func1()print("这是func1") end--先定义,再调用,没有问题 func1() -------------------------…...
Linux systemd 服务全面详解
一、systemd 是什么? systemd 是 Linux 系统的现代初始化系统(init)和服务管理器,替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”,还统一管理服务、日志、设备挂载、定时任务等。 核心作用 服务管理…...
Linux系统调用编程
目录 1.Linux下进程和线程进程线程区别查看进程pid终止进程pid 2.Linux虚拟内存管理与stm32内存映射设计目标与架构差异地址空间管理机制对比内存使用与性能特性 3.Linux系统调用函数fork()wait()exec() 4.树莓派环境下练习创建账号1创建用户账号2.配置用户权限3.查看用户 登录…...
AWS Langfuse AI用Bedrock模型使用完全教程
AWS Langfuse AI使用完全教程 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 AWS Langfuse AI使用完全教程Langfuse是什么?准备工作创建Langfuse账户1.创建LLM应用程序启用Bedrock…...
【Docker项目实战】使用Docker部署MediaCMS内容管理系统
【Docker项目实战】使用Docker部署MediaCMS内容管理系统 前言一、MediaCMS介绍1.1 MediaCMS 简介1.2 主要特点1.3 使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载Med…...
OpenHarmony子系统开发 - DFX(一)
OpenHarmony子系统开发 - DFX(一) 一、DFX概述 简介 在OpenHarmony中,DFX(Design for X)是为了提升质量属性的软件设计,目前包含的内容主要有:DFR(Design for Reliability,可靠性)…...
深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频 引言 Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一…...
详解数据结构线性表 c++实现
线性表 线性表是一种非常基础且重要的数据结构,它是具有相同数据类型的 n(n≥0)个数据元素的有限序列。这里的 “有限” 意味着元素的数量是确定的,“序列” 则表示元素之间存在着顺序关系。 顺序表 顺序表是线性表的一种顺序存…...
Prolog语言的网络协议栈
Prolog语言的网络协议栈 引言 网络协议栈是现代计算机网络的重要组成部分,它负责在网络中的各个节点之间以标准化的方式传输数据。在这一体系中,不同层次的协议相互协作,以实现从物理传输到应用层数据处理的功能。Prolog是一种以符号逻辑为…...
音视频基础(音频常用概念)
文章目录 **1. 比特率(Bitrate)****概念****影响****音频比特率****视频比特率** **2. 码率(Bitrate)****3. 帧(Frame)****概念****视频帧****音频帧** **4. 帧长(Frame Length)****…...