Android进阶之路 - StringUtils、NumberUtils 场景源码
忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景,开始使用 NumberUtils.isNumber() 提示错误 ,没有解决问题(可能是因为依赖版本导致),最后使用的是StringUtils.isNumeric(),当时关于这个问题场景的Bolog也放到了草稿箱中,一直保留至今才抽时间补充起来…
其实问题早已解决,但是不影响我们再好好读一下 StringUtils、NumberUtils源码,以便在更多场景中活学活用
- 触发场景
- 基础了解
- StringUtils
- 判空 isEmpty(空)、isNotEmpty(非空)
- 判空 isBlank(空)、isNotBlank(非空)- 过滤空格
- 过滤、去除 strip、stripToEmpty、stripStart、stripToNull、stripToEmpty 等
- 去空 trim、trimToNull、trimToEmpty
- 判断 是否为数字 isNumeric、isNumericSpace
- NumberUtils
- 俩数比较
- 获取 最大值、最小值
- 判断 字符串是否为数字、是否全为数字
- 类型创建 createInteger、createDouble 、createLong等
- 类型转换 toInt、toDouble、toLong等
触发场景
当时所处理场景( Java、Android工具整理 - 单位换算),需注意 当时调用的StringUtils是alipay封装的

基础了解
其实不论是StringUtils,还是NumberUtils 都是 org.apache.commons.lang3 提供的工具类;依赖引用 implementation 'org.apache.commons:commons-lang3:3.9'
build.gradle
implementation 'org.apache.commons:commons-lang3:3.9'
org.apache.commons.lang3

StringUtils
StringUtils官方文档 (导入包:import org.apache.commons.lang3.StringUtils;)

其实在学习源码中,你会发现可以很便捷的找到方法,同时这些方法的一些实际使用都有标明示例
判空 isEmpty(空)、isNotEmpty(非空)
开发中isEmpty、isNotEmpty 使用非常频繁,正好看看源码(感觉看过后都没必要介绍了...)

isEmpty :判断条件以 null 或 String长度为标准
StringUtils.isEmpty(null) = trueStringUtils.isEmpty("") = trueStringUtils.isEmpty(" ") = false //内部空格默认 length()==1,故为falseStringUtils.isEmpty("bob") = falseStringUtils.isEmpty(" bob ") = false
isNotEmpty:内部实现直接是 !isEmpty,简而言之就是 只要不为null 或 String.length() >0 即为非空
StringUtils.isNotEmpty(null) = falseStringUtils.isNotEmpty("") = falseStringUtils.isNotEmpty(" ") = trueStringUtils.isNotEmpty("bob") = trueStringUtils.isNotEmpty(" bob ") = true
判空 isBlank(空)、isNotBlank(非空)- 过滤空格
这俩个API好像使用的频率稍微低一些,于上者的区别主要在于对 " " 场景的定义
对应Api调用时的示例都有,我们主要看一下isBlank内部实现,首先它具备了isEmpty的判断条件,同时也会判断是否存在空格,这里判断语句应该代表着如果不为空格就返回false,为空格的话也是返回true;关于 isNotBlank 的实现直接调用的 !isBlank ~

过滤、去除 strip、stripToEmpty、stripStart、stripToNull、stripToEmpty 等
在开发中有一个很常见的场景:经常需要去除字符串中的空格,或者某些数据~
StringUtils.strip 提供的一些方法

stripToNull、stripToEmpty
共同点:都调用了strip(str, null)
当数据为空或null时,有一些不同点
stripToNull判断字符串为空时,返回的值为nullstripToEmpty判断字符串为空时,返回的值为 ""
找点不足:只能去除前后空格,字符串中的间的空格无法去除!

strip :当需要过滤特定数据或空串时可直接使用strip方法,第二个参数为需要过滤的数据
找些不足
无筛选条件下(及为null 或 ""),首尾空格都可以去除有筛选条件下优先去除筛选数据,空格可能会残留(如果有需要,可以二次调用特意除去空格)当过滤数据位于其余数据中,可能会出现无法筛选的情况,类似以下场景
StringUtils.strip(" abcyx", "xyz") // 输出: abc
StringUtils.strip(" abycyx", "xyz") // 输出: abyc

从strip 方法可以看到stripStart、stripEnd ,,有兴趣的可以,稍微看一下
- 内部一个是
正序过滤,一个是倒序过滤 - 过滤场景也是一个注重头部,一个注重尾部
stripStart

stripEnd

去空 trim、trimToNull、trimToEmpty
其实 trim 和 strip 有些地方还是挺相同的,都可以去除字符串中首位空格;相比而言trim功能能独立一些,strip扩展性多一些
通过 StringUtils.trim,查看相关API

trim:当数据为null、空字符串串、仅有空格字符串,根据传值返回 null、""、期望值

我自己试了一下" a b c ",果然是不支持去除中间空格的
StringUtils.trim("")) //输出:""StringUtils.trim(" ")) //输出:""StringUtils.trim(" abc ")) //输出:abcStringUtils.trim(" a b c ") //输出:a b c
稍微注意下 StringUtils.trim(null) ,正常开发中在它上一层应该是已经抛去null场景了,假设遇到需要关注下以下问题
这种写法一般会导致程序奔溃,应该是空指针异常
var trim = StringUtils.trim(null)Log.e("tag", trim.toString())
如果想在这种场景使用的话,可以写个方法默认返回"",如下
var trim = StringUtils.trim(null)if (StringUtils.isEmpty(trim)) trim = ""Log.e("tag", trim.toString())
trimToNull、trimToEmpty :当数据为null、空字符串串、仅有空格字符串时,返回值有所不同
trimToNull:返回的值为nulltrimToEmpty:返回的值为 ""
trimToNull:当数据为null、空字符串串、仅有空格字符串,都会返回 null

trimToEmpty:当数据为null、空字符串串、仅有空格字符串,都会返回 ""

判断 是否为数字 isNumeric、isNumericSpace
isNumeric
只有纯整数才会返回true,其余类型均为false,例如浮点型、正负数等
假设你需要判断是否为数字,及整数、小数的话,可以用 NumberUtils.isCreatable()

isNumericSpace
通过源码可以发现是在isNumeric的基础上,过滤了空串,支持以下场景可以
StringUtils.isNumeric("10000").toString() //输出:trueStringUtils.isNumericSpace("10 000").toString() //输出:trueStringUtils.isNumericSpace("10 00 0 ").toString() //输出:true

NumberUtils
NumberUtils官方文档(导入包:import org.apache.commons.lang3.math.NumberUtils;)

有兴趣的可以直接跳 NumberUtils 类,通过 Ctrl+F12 查看方法

俩数比较
compare 只能比较俩个数值(如果涉及多数值比较,可看看max、min满不满足需求)

示例
NumberUtils.compare(1, 2); // -1 参数1比参数2大,返回1,否则返回-1
通过源码,可证明 参数1比参数2大,返回1,否则返回-1

获取 最大值、最小值
不论是最大值还是最小值,都有重载方法,可以传入一个数组,或者是3个数值
最小值

示例
NumberUtils.min(new int[]{3, 5, 9})); // 3NumberUtils.min(3, 1, 4)); // 1
最大值

示例
NumberUtils.max(new int[]{3, 5, 9}); // 9NumberUtils.max(3, 1, 4); // 4
判断 字符串是否为数字、是否全为数字
isCreatable 检查字符串是否为数字
- isCreatable 最新
- isNumber 过时方法
NumberUtils.isCreatable("3.4"); // trueNumberUtils.isNumber("123"); // true
·isDigits 判断字符串中是否全为数字
NumberUtils.isDigits("0000000000.596"); // falseNumberUtils.isDigits("0000000000596"); // true
类型创建 createInteger、createDouble 、createLong等
| Api | 含义 |
|---|---|
| createInteger | 通过字符串创建Integer |
| createLong | 通过字符串创建Long |
| createFloat | 通过字符串创建Float |
| createDouble | 通过字符串创建Double |
| createNumber | 通过字符串创建Number |
| createBigInteger | 通过字符串创建BigInteger |
| createBigDecimal | 通过字符串创建BigDecimal类型,支持long、int、float、double、number等数值 |
As 智能提示

NumberUtils
NumberUtils.createInteger("11")NumberUtils.createDouble("10")
等同于 Java
Integer.parseInt("11");Double.parseDouble("10");
等同于 Kt(Kt自带类型推导,使用便捷)
"11".toInt()"10".toDouble()
Kt的to类型,其内部源码也是封装了对应的扩展函数,实现也是用的Java的parse类型实现方式

类型转换 toInt、toDouble、toLong等

以 toInt 为例
As 智能提示

如果传空串,返回1,否则字符串转换为Int值
NumberUtils.toInt("10",1);
通过toInt源码可以发现 to类型方法都是通过Java的parse类型转换,只是针对空值可设置返回默认值

相关文章:
Android进阶之路 - StringUtils、NumberUtils 场景源码
忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景,开始使用 NumberUtils.isNumber() 提示错误 ,没有解决问题(可能是因为依赖版本导致),最后使用的是StringUtils.isNumeric(),当时关…...
装备制造业数字化转型CRM系统解决方案(信息图)
一、制造企业面临的机遇与挑战 2021年12月28日,工业和信息化部等八部门联合对外发布《“十四五”智能制造发展规划》,明确提到“推进智能制造,要立足制造本质,紧扣智能特征,以工艺、装备为核心,以数据为基…...
CGAL 二维剖分
目录一、 2D Triangulations1、定义2 Representation2.1 The Set of Faces2.2 A Representation Based on Faces and Vertices3 Software Design4 Basic Triangulations4.1 Description遍历三角网顶点4.2 Implementation4.3 Geometric Traits4.4 Example of a Basic Triangulat…...
node.js+vue婚纱影楼摄影婚庆管理系统vscode项目
:减少管理婚庆工作人员的负担;管理人员可以随时浏览婚纱网站以便及时知道哪里需要修改和更进,同时还可以查看用户反馈给我们的信息,让管理员更加直观的了解客户的需求;该系统改变了以前手工记录的方式,使用…...
C语言 指针的新理解
16年写了很多 C 与 C 相关的文章,但是后面从事了 Android 开发,就全部删掉了,无意中发现了这篇由还存在草稿箱,索性就找回来吧,也是追忆当年学习的青葱岁月 1.指针就是一个存储了其他变量地址的变量。 指针存储的是整…...
【向每个应用View中增加子控件 Objective-C语言】
一、把刚才计算九宫格的思路再给大家过一遍 1.现在我们要计算九宫格坐标 1)先把每一个格子,每一个九宫格的大小,先确定了, 在这里先指定宽和高 CGFloat appW = 75; CGFloat appH = 90; 2)再去计算第一个格子的一些间距, 到上面的间距,marginTop = 30; 再计算出…...
【FPGA】Verilog:组合电路设计 | 三输入 | 多数表决器
前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载的示例:表决器(三人表决器)。 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部…...
【安全等保】安全等保二级和三级哪个高?哪个费用更高?
等保政策已经严格落地执行了,各大企业纷纷接到了过等保的通知,但有的估计是第一次听到等保,对于等保相关政策都是非常蒙圈的。这不不少企业相关负责人在问,安全等保二级和三级哪个高?哪个费用更高?这里我们…...
C++ STL学习记录(v1)
C STL学习记录一. 什么是STL1.1 STL的诞生1.2 STL基本概念1.3 STL的六大组件1.4 STL中的容器、算法、迭代器1.5 容器、算法、迭代器实践一. 什么是STL 1.1 STL的诞生 STL建立的目的就是为了解决软件界复用性的需求。C的面向对象和泛型编程思想,目的就是为了复用性的…...
开发中遇到的问题
1.当写一个导出功能时,因为编码写URL地址&参数的时候,用反转字符串的时候换行了,造成地址拼接不成,一直报错,后来发现是编码格式造成的,已解决。 解决方案:不换行或者用 “”拼接 2.当本地…...
Javascript笔记
数据类型 基本类型(primitive value) 简单的数据段,包括 Undefined, Null, Boolean, Number, String初始化只使用2原始字面量形式,如果使用new则会创建Object无法加入新的属性 引用类型(reference value) 可能由多个值构成的对象判断类型 typeofinstanc…...
Elasticsearch(ES)配置及优化
在Elasticsearch中,索引的大小和存储能力取决于多个因素,包括文档大小、索引的分片数、硬件规格、查询负载和其他因素。索引和分片配置:索引和分片的数量和配置会对查询并发性能产生影响。如果索引和分片的数量太少,可能会导致查询…...
一文看懂Java语言与Java生态圈
Java语言与Java生态圈 1、Oracle JDK与Open JDK之间的关系 Oracle JDK Java最早是由SUN公司发明,Oracle JDK之前叫SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购之后被名为Oracle JDK,实际上࿰…...
GitHub 上有什么嵌入式方面的项目?
原文直达,喜欢就点个赞吧! GitHub 上有什么嵌入式方面的项目? - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/27835930/answer/2871624679 前言 对于GitHub,可能做互联网开发的同学会更加熟悉,尤其是前端࿰…...
【C语言进阶】结构体、位段、枚举和联合
👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…...
markdown和latex常用部分参考@注脚@链接跳转@csdn
文章目录refmarkdown和latex常用部分参考typora文档基础语法扩展语法链接内联链接的方式将链接提取出来链接示例typora的支持LinksInline LinksInternal Links🎈Reference LinksURLs文章内部跳转(Heading IDs)🎈My Great Heading注脚(Footnotes)…...
Java 在二叉树中增加一行
623. 在二叉树中增加一行中等给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。注意,根节点 root 位于深度 1 。加法规则如下:给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur…...
kubernetes(k8s) 知识总结(第2期)
1. “控制器”思想 kube-controller-manager 是一系列控制器的集合,这些控制器被放在 Kubernetes 项目的 pkg/controller 目录,这些控制器都以独有的方式负责某种编排功能。它们都遵循一个通用的编排模式——控制循环。 以 Deployment 为例介绍它对控…...
windows-Mysql的主从数据库同步设置
复制原有的mysql修改my.ini配置文件 修改端口号修改从数据的地址和从数据库的数据存放地址安装从数据库进入从数据库的bin目录,打开命令窗口输入命令:mysqld.exe install mysql-back --defaults-file "C:\ProgramData\MySQL\MySQL Server 5.7-back\…...
Docker逃逸
文章目录原理环境搭建Docker 环境判断Docker 容器逃逸特权模式逃逸如何判断是否为特权模式逃逸docker.sock挂载逃逸逃逸Remote API未授权访问未授权访问逃逸容器服务缺陷逃逸影响版本环境搭建逃逸脏牛漏洞逃逸参考原理 docker其实就是一个linux下的进程,它通过Name…...
技术指标——格雷厄姆指数
文章目录1. 格雷厄姆指数是什么?2. 格雷厄姆指数的作用是什么?3. 举例计算例1:牛市顶部(2021年2月)例2:熊市底部(2024年2月)例3:中性水平(假设某一般时刻&…...
告别蜗牛速度!优麒麟20.04 LTS换源华为云镜像保姆级教程
优麒麟20.04 LTS提速指南:华为云镜像配置全解析 每次在优麒麟上安装软件时,看着进度条像蜗牛一样缓慢前进,是不是让你感到无比焦虑?特别是当你急需某个工具完成工作时,漫长的等待简直让人抓狂。作为一款基于Ubuntu的国…...
RAG深度解析一:从参数化知识到检索增强的范式重构
【内容定位】深度技术原理【文章日期】2026-03-27【场景引入】进入2026年3月,一场围绕大语言模型“可信性”的讨论在技术社区再度升温。开发者们早已不再争论模型参数量,而是转向一个更实际的问题:如何让动辄千亿参数的大模型,在回…...
嵌入式工程师技术成长路径:从单片机到Linux驱动开发
嵌入式工程师职业发展路径的技术思考1. 职业发展阶段与技术演进1.1 单片机开发阶段对于刚毕业的电子工程专业学生,单片机开发通常是职业起点。这一阶段主要涉及:8/16/32位微控制器(如STM32系列)的应用开发基础外设驱动开发(GPIO、UART、SPI、I2C等)实时操…...
终极Chrome全页截图指南:一键保存完整网页内容的高效方案
终极Chrome全页截图指南:一键保存完整网页内容的高效方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-ex…...
SpringBoot整合MQTT实战:手把手教你实现设备动态连接与主题订阅管理(附完整源码)
SpringBoot整合MQTT实战:动态连接与主题订阅管理的工程化实现 在物联网项目开发中,设备连接管理和消息路由的灵活性往往是系统设计的难点。想象这样一个场景:你的智慧农业系统需要随时接入新部署的土壤传感器,气象站设备可能因网…...
VirtualBox虚拟机磁盘空间分配技巧:如何用动态分配40G空间玩转Debian 12
VirtualBox磁盘空间动态分配实战:以Debian 12为例的40GB高效配置指南 在虚拟化技术日益普及的今天,VirtualBox作为一款开源免费的虚拟化工具,凭借其跨平台特性和易用性,成为众多开发者和技术爱好者的首选。然而,许多用…...
别再手动折腾了!用Docker一键部署Oracle 11g开发环境(附阿里云镜像地址)
告别繁琐配置:Docker容器化Oracle 11g开发环境实战指南 每当新项目需要搭建Oracle开发环境时,开发者们总会面临相同的困境——数小时的安装配置、复杂的系统依赖、难以复现的环境问题。传统安装方式不仅消耗宝贵时间,更可能因系统差异导致团…...
【AI微实验】这就deepseek对音频处理的理解╮(╯▽╰)╭
【手把手】零基础用PythonLibrosa搞定古琴音高识别,附完整代码1. 为什么要用代码“听”古琴?——传统音乐数字化的第一关1.1 从“泠泠七弦上”到“0和1”:音乐信息检索的价值1.2 核心任务拆解:基频(F0)是什…...
保姆级教程:在Ubuntu 20.04上搞定海思SS524/SS522 SDK编译与固件烧录
海思SS524/SS522开发实战:从零构建嵌入式Linux系统的完整指南 作为一名长期深耕嵌入式开发的工程师,我深知从零开始搭建一个完整的开发环境有多么令人头疼。特别是当你拿到一块全新的开发板,面对陌生的SDK和工具链时,那种既兴奋又…...
