Android进阶之路 - StringUtils、NumberUtils 场景源码

news2024/11/13 14:38:14

忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景,开始使用 NumberUtils.isNumber() 提示错误 ,没有解决问题(可能是因为依赖版本导致),最后使用的是StringUtils.isNumeric(),当时关于这个问题场景的Bolog也放到了草稿箱中,一直保留至今才抽时间补充起来…

其实问题早已解决,但是不影响我们再好好读一下 StringUtils、NumberUtils源码,以便在更多场景中活学活用

      • 触发场景
      • 基础了解
      • StringUtils
        • 判空 isEmpty(空)、isNotEmpty(非空)
        • 判空 isBlank(空)、isNotBlank(非空)- 过滤空格
        • 过滤、去除 strip、stripToEmpty、stripStart等
        • 判断 是否为数字 isNumeric、isNumericSpace
      • NumberUtils
        • 俩数比较
        • 获取 最大值、最小值
        • 判断 字符串是否为数字、是否全为数字
        • 创建 create基本类型
        • 转换 to基本类型

触发场景

当时所处理场景( 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)      = 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 ~

在这里插入图片描述

过滤、去除 strip、stripToEmpty、stripStart等

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

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

在这里插入图片描述

判断 是否为数字 isNumeric、isNumericSpace

isNumeric

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

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

在这里插入图片描述

isNumericSpace

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

 StringUtils.isNumeric("10000").toString()  //输出:true
 StringUtils.isNumericSpace("10 000").toString()  //输出:true
 StringUtils.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})); // 3
  NumberUtils.min(3, 1, 4)); // 1

最大值

在这里插入图片描述

示例

  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

创建 create基本类型

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类型实现方式

在这里插入图片描述

转换 to基本类型

在这里插入图片描述

以 toInt 为例

As 智能提示

在这里插入图片描述

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

 NumberUtils.toInt("10",1);

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑指 Offer 43. 1~n 整数中 1 出现的次数

题目 输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。 思路 要求出小于等于 n 的非负整数中数字 1 出现的个数…

Prometheus系列(五)grafana web 配置邮件告警

目录 1. contact points(创建告警渠道) 2. Notification policies(创建告警通道匹配规则) 3. Alert rules(配置告警策略) 告警配置 告警页面名词解释: 1. contact points(创建告…

玩转数据结构之Java实现线段树

前言 线段树是一种二叉搜索树,线段树的每个结点都存储了一个区间,也可以理解成一个线段,在这些线段上进行搜索操作得到你想要的答案。 线段树的适用范围很广,可以在线维护修改以及查询区间上的最值,求和。更可以扩充到…

一文浅谈sql中的 in与not in,exists与not exists的区别以及性能分析

文章目录1. 文章引言2. 查询对比2.1 in和exists2.2 not in 和not exists2.3 in 与 的区别3. 性能分析3.1 in和exists3.2 NOT IN 与NOT EXISTS4. 重要总结1. 文章引言 我们在工作的过程中,经常使用in,not in,exists,not exists来…

Unity2018.4.x~2021.3.x版 Android资源处理

注意:本文都是针对使用Gradle编译从Unity2018.4.x到Unity2020.3.x都是可以直接将Android的适配资源直接放到${PROJECT_PATH}/Assets/Plugins/Android/对应的目录下的,如:在此目录下可以方安卓平台对应的assets、res目录及子目录资源&#xff…

前端的CSS样式表知识提要

文章目录前言基本概念屏幕尺寸屏幕分辨率屏幕像素密度/像素密度/屏幕密度视口和浏览器窗口长度单位:px、em/rem和vhCSS属性的继承与覆盖CSS选择器CSS 布局基础盒子模型绝对定位和相对定位display属性浮动正常布局流(normal flow)Flexbox 布局…

【Python表白代码】 2.14“Valentine‘s Day”“没别的意思 就是借着特殊日子说声喜欢你”你在哪儿?我去见你~(各种玫瑰源码合集)

导语 Valentines Day Every man is a poet when he is in love 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 哈喽!我是你们的木木子吖~ 情人节又到了,礼物备好了没&am…

k8s部署Prometheus+Grafana

1.prometheus简介 Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud开发的,社区活跃,2016年加入了云原生计算基金会成为继Kubernetes之后的第二个托管项目;普罗米修斯以时间序列数据的形式收集并存储度量值&#xff…

python爬虫--xpath模块简介

一、前言 前两篇博客讲解了爬虫解析网页数据的两种常用方法,re正则表达解析和beautifulsoup标签解析,所以今天的博客将围绕另外一种数据解析方法,它就是xpath模块解析,话不多说,进入内容: 一、简介 XPat…

2023年谷歌蜘蛛池最全指南

本文主要是2023年关于谷歌蜘蛛池的一系列疑问,我们逐一提供解答。 本文由光算创作,有可能会被修改和剽窃,我们佛系对待这种行为吧。 首先最常见的新手问题是“什么叫谷歌蜘蛛池?” 答案是:谷歌蜘蛛池是一个深度研究谷…

微服务网关(九)负载均衡底层详细

微服务网关(九)负载均衡 四大负载均衡策略 随机负载 随机挑选目标服务器IP 轮询负载 ABC三台服务器,以ABCABC的顺序依次轮询 加权轮询 给目标服务器设置访问权重值,按照权重轮询负载 一致性哈希轮询 固定的一个客户端IP请求访…

图文解答之最短路径||

最短路径|| 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到…

rust过程宏 proc-macro-workshop解题-0-介绍

名字版本号rust1.69.0OSubuntu22.04proc-macro-workshop是一个学习rust过程宏非常好的工程。里边包含五大类题目。并且每种题目都有实际价值,可以应用在企业级项目中。我们在这里先介绍一下这个项目如何运行如何测试,如何验证过程宏的正确性以及如何调试。 本文只围绕以下几个…

2月编程语言排行榜出炉,第一名势头强劲

近日,TIOBE公布了2023年2月编程语言排行榜,本月各个语言表现如何?谁又摘得桂冠? TIOBE 2月Top15编程语言: 详细榜单查看TIOBE官网 https://www.tiobe.com/tiobe-index/ 关注IT行业的小伙伴们都知道,编程…

Linux入门篇(一)

Linux前言Linux初探Linux内核GNU实用工具shellLinux发行版bash shell 基础Linux文件系统Linux文件操作命令前言 在阅读诸如docker之类的书的时候,经常碰到Linux的知识。同时,大部分的盲区也是在Linux方面。因此就想稍微了解一下这个广为人使用的操作系统…

docker-入门到精通

docker知识总结 参考文档 https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/–volumes-from.html 1、什么是docker ​ 容器技术、虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式,容器技术可以在按需构建操作系统实例…

vue3 Proxy响应式原理分析(面试题)

在开始正文前,先理一下vue2 Object.defineProperty 和 vue 3 Proxy 区别: Object.defineProperty:数据劫持 Proxy:数据代理 注意: 响应式原理和双向数据绑定原理是两回事,一般面试官会先问响应式原理再问双…

内网渗透(二十三)之Windows协议认证和密码抓取-Mimikatz介绍和各种模块使用方法

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

ShardingSphere-Proxy 数据库协议交互解读

数据库协议对于大部分开发者来说算是比较冷门的知识,一般的用户、开发者都是通过现成的数据库客户端、驱动使用数据库,不会直接操作数据库协议。不过,对数据库协议的特点与流程有一些基本的了解,有助于开发者在排查数据库功能、性…

Fabric磁盘扩容后数据迁移

线上环境原来的磁盘比较小,随着业务数据的增多,磁盘需要扩容,因此需要把原来docker数据转移至新的数据盘。 数据迁移 操作系统: centOS 7   docker默认的数据目录为/var/lib/docker   创建一个新的目录/opt/dockerdata&…