忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景,开始使用 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(非空)

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

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

其实 trimstrip 有些地方还是挺相同的,都可以去除字符串中首位空格;相比而言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 场景源码相关推荐

  1. Android 进阶之路:ASM 修改字节码,这样学就对了!

    本文已授权个人公众号「鸿洋」原创发布. 恢复双休了,准备捡起来写博客这件事,会尝试写好每一篇博客,准备写一个「进阶之路」的系列,希望对你有用. 没错,看了很多 ASM 入门的文章,都感觉文章写的很轻松 ...

  2. Android进阶之路 - 解决部分手机拍照之后图片被旋转的问题

    这几天犯了一个错误,初期想着甩锅给后台的- 但还好及时发现了是自身的问题~ 关联文章 Android基础进阶 - 调用拍照.获取图片(基础) Android基础进阶 - 获取.调用相册内图片(基础) ...

  3. Android进阶之路 - 批量下载、缓存图片、视频

    之前已经记录过,批量下载图片和缓存本地的方式,此篇主要记录批量下载图片.视频,同时缓存在本地的功能实现 关联篇 Android进阶之路 - 批量下载.缓存图片 Android进阶之路 - 批量下载.缓 ...

  4. Android进阶之路 - 软键盘中右下角的设置与监听

    在项目中,多多少少会遇到修改软键盘右下角按钮的需求,虽然已经写过几次,但是还是觉得在这里专心做个笔记比较放心 ~ 我的那些软键盘Blog ~ Android进阶之路 - 常见软键盘操作行为 Andro ...

  5. Android进阶之路 - 批量下载、缓存图片

    在日常项目开发中,关于图片批量下载,数据缓存的相关功能比比皆是,这次也是去年在项目中需要在本地缓存商品数据,所以用到了批量下载的功能,特此记录 ~ 关联篇 Android进阶之路 - 批量下载.缓存图 ...

  6. Android进阶之路 - 存、取、读 本地 Json 文件

    最近在开发中又开始加载一些本地的json数据源,回头看之前竟然没记录,赶紧记录一波 ~ 如何准备一个合格的json文件? AndoridStudio中如何存放json文件? 如何读取本地Json文件数 ...

  7. 这份1307页Android面试全套真题解析,源码+原理+手写框架

    前言 前不久,几个朋友聚会,谈到了现在的后辈,我就说起了那个大三就已经拿到网易offer的小学弟. 这个学弟是00后,专升本进入我们学校的.进来后就非常努力,每次上课都是第一个到教室的,每次都是坐第一 ...

  8. 直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇)

    直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇) 在当下移动直播火爆的年代,如果你曾经使用过移动端直播应用,相信会被里面那令人惊叹的礼物动画效果迷住,比如像下面这样的效果. ...

  9. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)

    大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...

最新文章

  1. 汇总 | 精选CVPR开源项目学习资源
  2. 不是方阵有逆矩阵吗_吴恩达机器学习笔记18逆矩阵、矩阵转置
  3. HTML怎么编写可关闭广告,JS实现关闭小广告特效
  4. C. Three Parts of the Array(切割字符串)
  5. Boost:Boost概念的function_requires()的测试程序
  6. 我们离DevOps有多远--持续集成思想的延伸
  7. ecshop分页类assign_pager分析和扩展
  8. “上云”很 fashion 的今天,GeekPwn 搞了个比赛……
  9. Leetcode 236.二叉树的最近公共祖先
  10. 原在一个tableView上应用不同类型的DTAttributedTextCell
  11. 阿里云POLARDB 2.0重磅来袭!为何用户如此的期待?
  12. Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
  13. 灵思致远测色仪色差宝和颜色识别器APP介绍
  14. 非线性动力学中的同步,同步有哪几类?
  15. 基于STM32F030实现RFID射频识别
  16. Mplay 常用命令及功能简介
  17. 乐符识别matlab,基于DPP的自动音符切分识别研究
  18. springboot与mybatis整合
  19. 仿163邮箱上传多附件,有点酷
  20. 瓜瓜的时空旅行,第三次模拟赛,dfs序+线段树维护最小值

热门文章

  1. 微型计算机的一般工作过程,微型计算机的基本工作原理
  2. 【IoC 和 DI 有什么区别】
  3. SQL-视图(view)
  4. python-数据分析--案例分析:美国各州人口数据分析
  5. Redis系列-存储篇list主要操作函数小结
  6. 【乐理知识】第一章谱表
  7. PRD-产品需求说明文档
  8. 计算机安全论文摘要,信息安全论文摘要.doc
  9. G711 G729音频编码总结
  10. 软考 程序员教程-第三章 数据库基础知识