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封装的

Android进阶之路 - StringUtils、NumberUtils 场景源码_第1张图片

基础了解

其实不论是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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第2张图片


StringUtils

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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第3张图片

其实在学习源码中,你会发现可以很便捷的找到方法,同时这些方法的一些实际使用都有标明示例

判空 isEmpty(空)、isNotEmpty(非空)

开发中isEmptyisNotEmpty 使用非常频繁,正好看看源码(感觉看过后都没必要介绍了...

Android进阶之路 - StringUtils、NumberUtils 场景源码_第4张图片

isEmpty :判断条件以 null 或 String长度为标准

  StringUtils.isEmpty(null)      = true
  StringUtils.isEmpty("")        = true
  StringUtils.isEmpty(" ")       = false //内部空格默认 length()==1,故为false
  StringUtils.isEmpty("bob")     = false
  StringUtils.isEmpty("  bob  ") = false

isNotEmpty:内部实现直接是 !isEmpty,简而言之就是 只要不为null 或 String.length() >0 即为非空

  StringUtils.isNotEmpty(null)      = false
  StringUtils.isNotEmpty("")        = false
  StringUtils.isNotEmpty(" ")       = true
  StringUtils.isNotEmpty("bob")     = true
  StringUtils.isNotEmpty("  bob  ") = true

判空 isBlank(空)、isNotBlank(非空)- 过滤空格

这俩个API好像使用的频率稍微低一些,于上者的区别主要在于对 " " 场景的定义

对应Api调用时的示例都有,我们主要看一下isBlank内部实现,首先它具备了isEmpty的判断条件,同时也会判断是否存在空格,这里判断语句应该代表着如果不为空格就返回false,为空格的话也是返回true;关于 isNotBlank 的实现直接调用的 !isBlank ~

Android进阶之路 - StringUtils、NumberUtils 场景源码_第5张图片


过滤、去除 strip、stripToEmpty、stripStart、stripToNull、stripToEmpty 等

在开发中有一个很常见的场景:经常需要去除字符串中的空格,或者某些数据~

StringUtils.strip 提供的一些方法

Android进阶之路 - StringUtils、NumberUtils 场景源码_第6张图片

stripToNull、stripToEmpty

共同点:都调用了strip(str, null)

当数据为空或null时,有一些不同点

  • stripToNull 判断字符串为空时,返回的值为null
  • stripToEmpty 判断字符串为空时,返回的值为 ""

找点不足:只能去除前后空格,字符串中的间的空格无法去除!

Android进阶之路 - StringUtils、NumberUtils 场景源码_第7张图片

strip :当需要过滤特定数据或空串时可直接使用strip方法,第二个参数为需要过滤的数据

找些不足

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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第8张图片

从strip 方法可以看到stripStart、stripEnd ,,有兴趣的可以,稍微看一下

  • 内部一个是正序过滤,一个是倒序过滤
  • 过滤场景也是一个注重头部,一个注重尾部

stripStart

Android进阶之路 - StringUtils、NumberUtils 场景源码_第9张图片

stripEnd

Android进阶之路 - StringUtils、NumberUtils 场景源码_第10张图片


去空 trim、trimToNull、trimToEmpty

其实 trimstrip 有些地方还是挺相同的,都可以去除字符串中首位空格;相比而言trim功能能独立一些,strip扩展性多一些

通过 StringUtils.trim,查看相关API

Android进阶之路 - StringUtils、NumberUtils 场景源码_第11张图片

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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第12张图片

我自己试了一下" a b c ",果然是不支持去除中间空格的

 StringUtils.trim("")) //输出:""
 StringUtils.trim(" ")) //输出:""
 StringUtils.trim(" abc ")) //输出:abc
 StringUtils.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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第13张图片

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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第14张图片


判断 是否为数字 isNumeric、isNumericSpace

isNumeric

只有纯整数才会返回true,其余类型均为false,例如浮点型、正负数等

假设你需要判断是否为数字,及整数、小数的话,可以用 NumberUtils.isCreatable()

Android进阶之路 - StringUtils、NumberUtils 场景源码_第15张图片

isNumericSpace

通过源码可以发现是在isNumeric的基础上,过滤了空串,支持以下场景可以

 StringUtils.isNumeric("10000").toString()  //输出:true
 StringUtils.isNumericSpace("10 000").toString()  //输出:true
 StringUtils.isNumericSpace("10 00 0 ").toString()  //输出:true

Android进阶之路 - StringUtils、NumberUtils 场景源码_第16张图片


NumberUtils

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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第17张图片

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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第18张图片

俩数比较

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

Android进阶之路 - StringUtils、NumberUtils 场景源码_第19张图片

示例

  NumberUtils.compare(1, 2); // -1 参数1比参数2大,返回1,否则返回-1

通过源码,可证明 参数1比参数2大,返回1,否则返回-1

Android进阶之路 - StringUtils、NumberUtils 场景源码_第20张图片


获取 最大值、最小值

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

最小值

Android进阶之路 - StringUtils、NumberUtils 场景源码_第21张图片

示例

  NumberUtils.min(new int[]{3, 5, 9})); // 3
  NumberUtils.min(3, 1, 4)); // 1

最大值

Android进阶之路 - StringUtils、NumberUtils 场景源码_第22张图片

示例

  NumberUtils.max(new int[]{3, 5, 9}); // 9
  NumberUtils.max(3, 1, 4); // 4

判断 字符串是否为数字、是否全为数字

isCreatable 检查字符串是否为数字

  • isCreatable 最新
  • isNumber 过时方法
 NumberUtils.isCreatable("3.4"); // true
 NumberUtils.isNumber("123"); // true

·isDigits 判断字符串中是否全为数字

 NumberUtils.isDigits("0000000000.596"); // false
 NumberUtils.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 智能提示

Android进阶之路 - StringUtils、NumberUtils 场景源码_第23张图片

NumberUtils

  NumberUtils.createInteger("11")
  NumberUtils.createDouble("10")

等同于 Java

  Integer.parseInt("11");
  Double.parseDouble("10");

等同于 Kt(Kt自带类型推导,使用便捷

  "11".toInt()
  "10".toDouble()

Kt的to类型,其内部源码也是封装了对应的扩展函数,实现也是用的Java的parse类型实现方式

Android进阶之路 - StringUtils、NumberUtils 场景源码_第24张图片


类型转换 toInt、toDouble、toLong等

Android进阶之路 - StringUtils、NumberUtils 场景源码_第25张图片

以 toInt 为例

As 智能提示

在这里插入图片描述

如果传空串,返回1,否则字符串转换为Int值

 NumberUtils.toInt("10",1);

通过toInt源码可以发现 to类型方法都是通过Java的parse类型转换,只是针对空值可设置返回默认值

Android进阶之路 - StringUtils、NumberUtils 场景源码_第26张图片

你可能感兴趣的:(Android进阶之路,Java后端修行,Android,Java,StringUtils,NumberUtils)