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
判断字符串为空时,返回的值为null
stripToEmpty
判断字符串为空时,返回的值为 ""
找点不足:只能去除前后空格,字符串中的间的空格无法去除!
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
:返回的值为null
trimToEmpty
:返回的值为 ""
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…...

k8s项目部署
k8s命令k8s项目部署部署流程实现导出相应的yaml文件 kubectl create deployment 名字--image镜像-o yaml --dry-runclient > 文件名 例: kubectl create deployment nginx --imagenginx -o yaml --dry-runclient > m1.yaml导出已经部署后的yaml文件 kubectl g…...

Modbus通信协议学习笔记
Modbus主从设备 主控设备(Modbus Master):工控机、PLC、触摸屏等等 从设备(Modbus Slave):PLC、Modbus采集模块、带485通讯的传感器、仪器仪表等等 Modbus物理接口:串口(RS232、RS4…...

ubuntu重启、关机命令
// // // //之前用linux系统, 一键解决也是可以的,反正我每次用命令(泪目…),中间崩了好几次,换回win,此篇也做记录 // // // 重启命令 以下所有命令在root根目录下输入(普通用户&…...

Xshell 7 连接云服务器的步骤和出现的错误
一、工具准备云服务器Xshell 7二、使用 Xshell 7 连接数据库三、新建会话属性后,没有自动弹出 SSH 用户名要求输入四、SSH 用户身份验证不能输入 Password五、Xshell 连接 centos 7 服务器 报错提示 “ssh服务拒绝了密码,请再试一次“,但是密…...

Python多进程同步——文件锁
多个进程共享同一份资源(共享内存、文件等)时,会涉及到资源竞争问题。为了解决这种问题,一般采取的措施是进程在访问资源前加锁保护,避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。 目录…...

实现 element-plus 表格多选时按 shift 进行连选的功能
前言 element-plus表格提供了多选功能,可单击勾选一条数据,可全选。 现在有个很合理的需求,希望实现类似于文件系统中shift连续选择功能,并且在表格排序后,依照排序后的顺序连选。 一、el-table 多选表格基本使用 1、…...

华为OD机试真题JAVA实现【考古学家】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出说明...

Spring3之基于Aspect实现AOP
简介 使用 Aspect 搭配 Spring 可轻松实现 AOP;本章将通过一个完整示例演示如何实现这一功能 实现步骤 修改 beans.xml 配置文件的 schema 部分;可以在 spring-framework-reference.html 文件通过搜索关键字 “/aop” 找到配置 schema,然后…...

buctoj-寒假集训进阶训练赛(二十二)
问题 A: Stones 题目描述 由于自行车状态错误,森普尔开始每天早上从东到西走,每天晚上走回去。走路可能会有点累,所以森普这次总是玩一些游戏。 路上有很多石头,当他遇到一块石头时,如果是他遇到的奇数石头࿰…...

华为OD机试真题JAVA实现【静态扫描最优成本】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出描述示例一输入输出说明示例二输入输出说明...