java commons库之一:基础库lang(1)
前言
如果想要提高开发效率,就少不了对一些公共库的使用。java常用的公共类库有不少,包括apache commons、guava之类的,这里单独讲下apache commons,apache commons的类库在很多开源项目里都有使用,各种各样,有辅助使用的util,也有单独功能的,我按照使用的频率把常用的一些整理出来。
这次先从commons里最常见的**commons lang**开始
lang对应的是java.lang,也就是java默认的系统包,这个库如其名,就是对系统包的加强。目前lang的版本已经更新到lang3了,因为lang本身基本没啥依赖,所以基本需要的时候直接把jar包或maven pom引入就行
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
lang的内容主要包括下面几个部分
1.基本功能:由一堆utils组成,包括StringUtils(字符串),ArrayUtils(数组),RandomUtils(随机数),SystemUtils(系统信息)等
2.time(日期时间):主要是对日期时间简化功能
3.math(数学):一些数字类型转换的功能
4.concurrent(并发):一些对java.util.concurrent下面功能的简化
5.text(文本):对文本功能的封装,与字符串不同
6.reflect(反射):一些可以直接操作对象和成员的接口
7.mutable(变量):对基本类型,比如Integer之类的封装,可以进行引用操作
8.tuple(元组):提供了元组类型
篇幅有限,今天先列举下基本功能。
StringUtils
StringUtils是最常用字符串辅助工具包之一,里面包含了不少能够简化操作的功能。
IsEmpty/IsBlank:判断字符串是否为空,isEmpty是判断是否null,而isBlank更强大可以判断length是否为0
equals/compare:字符串比对,跟String自带的没大区别,但是自带null判断,不会出现空指针的问题
trim/strip:trim同上面的,也是对应String自带的部分,同样不会空指针的问题,strip要更强大一些,可以兼容更多的空字符串。
defaultString:字符串默认取值功能,可以在字符串为null或空的时候自动返回""或指定的值
indexOf/lastIndexOf:原本String的加强版,支持更多方式,支持输入多个字符串
difference:求第二个字符串与第一个字符串不同的地方
substring*:字串造成,原本String的加强版,除了能根据字符串的坐标进行截取外,还有其他几种选择
substringAfter和substringBefore,可以根据前后的字符串内容进行截取
比如StringUtils.substringBefore("abcba", "b") = "a"
substringBetween可以通过区间内容进行截取
比如获取tag中的内容
StringUtils.substringBetween("tagabctag", "tag") = "abc"
还可以获取某些闭合区间之间的内容,比如获取[]中的值
StringUtils.substringsBetween("[a][b][c]", "[", "]") = ["a","b","c"]
这种一般需要使用正则表达式实现的内容,可以在这里一句话搞定
startWith/endWith:判断字符串开始或结束的位置是否存在指定的字符串
reverse:颠倒字符串,很好玩吧
swapCase:大小写互换
left/right/truncate:这几个都是截断字符串的功能
leftPad/rightPad:截断或补充字符串,如果少了就截断,如果多了就补充
比如这样
System.out.println(StringUtils.leftPad("45643", 8, "0"));
结果为:00045643
rotate:移动操作,类似于汇编里的循环位移,不过这次移动内容是字符串
join:字符串组合功能,String里已经有join了,StringUtils的join更强大,支持其他一大堆数据类型
spilt:拆分字符串,相比String里别扭的正则法,这个可以直接用指定字符串或字符进行拆分
splitByCharacterTypeCamelCase:对字符串采用驼峰规则进行拆分
如它自带的这个例子
StringUtils.splitByCharacterTypeCamelCase("ASFRules") = ["ASF", "Rules"]
overlay:对字符串的指定位置进行覆盖,这个覆盖可以与覆盖的位置大小不同
StringUtils.overlay("abcdef", "zzzz", 8, 10) = "abcdefzzzz"
wrap:字符串包装,就是给字符串两侧加上指定的字符串
unwrap:把包装的字符串删掉,比如'java' unwrap后为 java
repeat:复制字符串自己,并且合并起来
remove*:删除字符串的某些内容,与c++std里的string不同,java的String不带删除,可以用StringUtils里这个接口来删除其中匹配的子串
getCommonPrefix:得到几个字符串都有的前缀
abbreviate:获取字符串的简写
System.out.println(StringUtils.abbreviate("随着网络的发展和智能手机的大面积普及,我们当中的很多人在遇到医学问题时会立即拿起手机上", 10));
结果为:随着网络的发展...
appendIfMissing:很有用的方法,添加字符串到字符串的后面,可以判断是否后面已经有这个字符串
System.out.println(StringUtils.appendIfMissing("随着网络的发展和智能手机的大面积普及", "普及"));
结果:随着网络的发展和智能手机的大面积普及
System.out.println(StringUtils.appendIfMissing("随着网络的发展和智能手机的大面积普及", "数据"));
结果:随着网络的发展和智能手机的大面积普及数据
capitalize:首字母大写
center:字符串居中,就是给前面补充空格
countMatches:字符串内部的一个统计方法
toEncodedString:等同于String的构造,将byte[]转到String
以上就是StringUtils的大体内容
ArrayUtils
ArrayUtils是对java数组和Arrays的补充
add:数组添加,系统数组不支持添加操作,可以通过这个方法对数组添加元素
contains/indexOf:查找元素
insert:数组内容插入,参照add
shuffle:打乱数组内容顺序
其他还有一些,自己可以根据需要去看javadoc
SystemUtils
与java系统相关的util,可以理解为System包的扩展
这个里面包含的主要是一些常量,包括
IS_JAVA_:当前jvm的判断判断
IS_OS_:操作系统类型和版本判断,某些跟操作系统有耦合的地方可以用到
JAVA_VERSION:当前jvm版本
还有些参数,如目录之类的获取,基本是对System.getenv的封装
比如OS_ARCH是CPU信息,OS_NAME是操作系统信息,USER_DIR是当前用户目录等
ThreadUtils
线程类util,封装了部分简单的线程操作
包括线程查询findThread,获取全部线程getAllThread等,本身非常简单,并不是专业的Thread类
RandomUtils
随机数util,对Random的封装,里面包含了与其类似的next方法,不过可以指定随机数的范围,而且不需要自己再单独维护一个Random对象
RandomStringUtils
随机字符串util,在RandomUtil基础上进行了增加,可以通过指定字符集生成随机字符串
SerializationUtils
序列化util,主要包含了serialize和deserialize两个方法,如果使用传统的序列化方式,你需要new一个ObjectInputStream或ObjectOutputStream对象
这两个方法可以直接通过byte[]或inputstream直接进行序列化或反序列化
ObjectUtils
相当于java7之后Objects的强化类,专门补充Object对象的操作
除了以上之外还包括:
BooleanUtils:boolean类型的增强,主要用于boolean类型的比较,转换,可以支持int、字符串以及其他很多词语对boolean的转换,如yes、no、off、no等
CharUtils:针对字符的辅助功能,包括字符的转换、判断等,
ArchUtils:处理器工具,可以用了获取当前处理器信息
Validate:校验工具,可以对很多类型的变量进行值判断,并且抛出异常,异常的内容或判断的范围可以定制。
以上就是lang里包含的大部分基本操作,因为每个对象里都有很多方法,很多就不单独列出来了,大家可以根据需要看看有哪些类是能够帮助自己在开发中用到的。
下一节将介绍lang的其他一些类,使用的范围也会更大。