- 前言:
- commons-lang3和commons-lang的区别
- 包结构
- ArrayUtils:用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等
- CharEncoding:过时。被Java自己的java.nio.charset.StandardCharsets取代
- CharUtils – 用于操作char值和Character对象
- ClassPathUtils:处理类路径的一些工具类
- ClassUtils – 用于对Java类的操作(有很多方法还是挺有用的)
- EnumUtils:辅助操作枚举的一些工具
- JavaVersion 枚举类,记录了java所有的版本号
- RandomStringUtils : 需要随机字符串的时候,它或许能帮上忙
- RandomUtils:这个不解释,如果你需要随机数字,用它吧。int、long、flort都是ok的
- RegExUtils:处理字符串用正则替换等
- SerializationUtils:对象的序列化工具。
- SystemUtils:主要定义了一些系统底层的常量。比如类路径、操作系统、类型、java版本等等
- StringUtils:处理字符串相关需求
- public static boolean isEmpty(CharSequence cs)
- public static boolean isAnyEmpty(CharSequence… css)
- public static boolean isNoneEmpty(CharSequence… css) 和isAnyEmpty取返
- public static boolean isBlank(CharSequence cs)
- isAnyBlank、isNoneBlank这里就不再解释了
- public static String trim(String str)
- public static int ordinalIndexOf(CharSequence str, CharSequence searchStr,int ordinal)
- public static boolean containsAny(CharSequence cs,char… searchChars)
- public static String substring(String str,int start)
- public static String join(T… elements)、public static String join(Object[] array,char separator)
- public static String deleteWhitespace(String str)
- public static String removeStart(String str,String remove)
- public static String rightPad(String str,int size,char padChar)
- public static String center(String str,int size)
- public static String capitalize(String str)、uncapitalize
- public static String swapCase(String str)
- public static boolean isAlpha(CharSequence cs)
- public static String reverse(String str)
- public static String abbreviate(String str,int maxWidth)
- public static String wrap(String str,char wrapWith)
- isAllBlank、isAllEmpty
- isAllLowerCase、isAllUpperCase
前言:
apache提供的众多commons工具包,号称Java第二API,而common里面lang3包更是被我们使用得最多的。因此本文主要详细讲解lang3包里面几乎每个类的使用,希望以后大家使用此工具包,写出优雅的代码
讲解版本为(2018年10月最新版本):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>
12345
在日常工作中,我们经常要使用到一些开源工具包,比如String,Date等等。有时候我们并不清楚有这些工具类的存在,造成在开发过程中重新实现导致时间浪费,且开发的代码质量不佳。而apache其实已经提供了系列的工具包给我们使用,只是大多数人,平时没有注意到。这个系列我将带领大家熟悉这些常用的工具包,让大家熟悉Apache都给我们提供了那些常用的工具类和方法……
commons-lang3和commons-lang的区别
lang3是Apache Commons 团队发布的工具包,要求jdk版本在1.5以上,相对于lang来说完全支持java5的特性,废除了一些旧的API。该版本无法兼容旧有版本,于是为了避免冲突改名为lang3
lang包可以说是废弃了,以后请不要使用。采用lang3直接代替即可
包结构
org.apache.commons.lang3
org.apache.commons.lang3.builder
org.apache.commons.lang3.concurrent
org.apache.commons.lang3.event
org.apache.commons.lang3.exception
org.apache.commons.lang3.math
org.apache.commons.lang3.mutable
org.apache.commons.lang3.reflect
org.apache.commons.lang3.text
org.apache.commons.lang3.text.translate
org.apache.commons.lang3.time
org.apache.commons.lang3.tuple
脑图如下:
类截图如下:
下面进行用得着的情况,从上倒下逐个类讲解。
ArrayUtils:用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等
- 它提供了8中基本数据类型以及包装类以及各种类型的长度为0的空数组。所以以后需要长度为0的数组,可以不用new了,直接用这个即可
public static final int[] EMPTY_INT_ARRAY = new int[0];
public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0];
12
- toString:功能基本同java自己的Arrays.toString方法
- hashCode:相同个数、相同顺序的数组hashCode会是一样的
public static void main(String[] args) {
Integer[] inArr = new Integer[]{1, 2, 3};
Integer[] inArr2 = new Integer[]{1, 2, 3};
System.out.println(ArrayUtils.hashCode(inArr)); //862547
System.out.println(ArrayUtils.hashCode(inArr2)); //862547
inArr = new Integer[]{1, 2, 3};
inArr2 = new Integer[]{1, 3, 3};
System.out.println(ArrayUtils.hashCode(inArr)); //862547
System.out.println(ArrayUtils.hashCode(inArr2)); //862584
}
1234567891011
- isEquals:该方法已经被废弃。取代的为java自己的java.util.Objects.deepEquals(Object, Object)
public static void main(String[] args) {
Integer[] inArr = new Integer[]{1, 2, 3};
Integer[] inArr2 = new Integer[]{1, 2, 3};
System.out.println(Objects.deepEquals(inArr, inArr2)); //true
inArr = new Integer[]{1, 2, 3};
inArr2 = new Integer[]{1, 3, 3};
System.out.println(Objects.deepEquals(inArr, inArr2)); //false
}
123456789
- toArray:可以简便的构建一个数组。但是注意下面的区别:
Integer[] integers = ArrayUtils.toArray(1, 2, 3);
Serializable[] serializables = ArrayUtils.toArray(1, 2, "3");
12
- nullToEmpty:将null转换为空的数组,如果数组不为null,返回原数组,如果数组为null,返回一个空的数组
- toObject/toPrimitive:这两个方法很有用 可以实现比如int[]和Integer[]数组之间的互转
Integer[] inArr = new Integer[]{1, 2, 3};
int[] ints = ArrayUtils.toPrimitive(inArr);
Integer[] integers = ArrayUtils.toObject(ints);
123
toStringArray:同上。这个方法是将Object数组转换成String数组。
public static void main(String[] args) {
Integer[] inArr = new Integer[]{1, 2, 3};
int[] ints = new int[]{1,2,3};
String[] strings = ArrayUtils.toStringArray(inArr);
//ArrayUtils.toStringArray(ints); //编译报错哟
}
123456
需要注意:
public static void main(String[] args) {
Integer[] inArr = new Integer[]{1, 2, null};
//String[] strings = ArrayUtils.toStringArray(inArr);
//如果里面有null元素,会报错的,所以我们可以用下面这个方法 把null转成指定的值即可
String[] strings = ArrayUtils.toStringArray(inArr,"");
}
12345678
- getLength、isSameLength:有时候建议使用。因为它是对null安全的。null的length为0
CharEncoding:过时。被Java自己的java.nio.charset.StandardCharsets取代
CharUtils – 用于操作char值和Character对象
- toCharacterObjec/toChart:把char或者String转为一个Character对象。互转。Character,valueOf()很多时候也能达到这个效果
- toIntValue:把char和Character转为对应的int值
- isAscii系列:判断该字符是否是Ascii码
ClassPathUtils:处理类路径的一些工具类
- toFullyQualifiedName(Class<?> context, String resourceName) 返回一个由class包名+resourceName拼接的字符串
public static void main(String[] args) {
String fullPath = ClassPathUtils.toFullyQualifiedName(Integer.class, "");
System.out.println(fullPath); //java.lang.
//fullPath = ClassPathUtils.toFullyQualifiedName(Integer.class.getPackage(), "Integer.value");
fullPath = ClassPathUtils.toFullyQualifiedName(Integer.class, "Integer.value");
System.out.println(fullPath); //java.lang.Integer.value
}
12345678
- toFullyQualifiedName(Package context, String resourceName) 返回一个由class包名+resourceName拼接的字符串
- toFullyQualifiedPath(Class<?> context, String resourceName) 返回一个由class包名+resourceName拼接的字符串
- toFullyQualifiedPath(Package context, String resourceName) 返回一个由class包名+resourceName拼接的字符串
ClassPathUtils.toFullyQualifiedPath(StringUtils.class, "StringUtils.properties") = "org/apache/commons/lang3/StringUtils.properties"
1
ClassUtils – 用于对Java类的操作(有很多方法还是挺有用的)
- getShortClassName:
public static void main(String[] args) {
System.out.println(int[].class.getSimpleName()); //int[]
System.out.println(ClassUtils.getShortClassName(int[].class)); //int[]
System.out.println(ClassUtils.getShortClassName(String.class)); //String
System.out.println(ClassUtils.getShortClassName(ArrayList.class)); //ArrayList
System.out.println(ClassUtils.getShortClassName("List")); //List
}
1234567
- getPackageName:获取包名
public static void main(String[] args) {
System.out.println(ClassUtils.getPackageName(int[].class)); //""
System.out.println(ClassUtils.getPackageName(String.class)); //java.lang
}
1234
- getAllSuperclasses:获取到该类的所有父类 注意:只是父类 不包含接口
public static void main(String[] args) {
List<Class<?>> allSuperclasses = ClassUtils.getAllSuperclasses(ArrayList.class);
System.out.println(ArrayUtils.toString(allSuperclasses)); //[class java.util.AbstractList, class java.util.AbstractCollection, class java.lang.Object]
}
public static void main(String[] args) {
List<Class<?>> allSuperclasses = ClassUtils.getAllSuperclasses(ArrayList.class);
System.out.println(ArrayUtils.toString(allSuperclasses)); //[class java.util.AbstractList, class java.util.AbstractCollection, class java.lang.Object]
allSuperclasses = ClassUtils.getAllSuperclasses(Object.class);
System.out.println(ArrayUtils.toString(allSuperclasses)); //[]
}
1234567891011
- getAllInterfaces:同上。但此方法指的是接口
- convertClassNamesToClasses/convertClassesToClassNames 见名知意
public static void main(String[] args) {
List<Class<?>> classes = ClassUtils.convertClassNamesToClasses(Arrays.asList("java.lang.Integer","java.lang.int"));
System.out.println(classes); //[class java.lang.Integer, null]
}
1234
- isPrimitiveOrWrapper、isPrimitiveWrapper 、primitiveToWrapper、primitivesToWrappers、wrapperToPrimitive判断是基本类型还是包装类型
public static void main(String[] args) {
System.out.println(ClassUtils.isPrimitiveOrWrapper(Integer.class)); //true
System.out.println(ClassUtils.isPrimitiveOrWrapper(int.class)); //true
//检测是否是包装类型
System.out.println(ClassUtils.isPrimitiveWrapper(Object.class)); //false 注意 此处是false
System.out.println(ClassUtils.isPrimitiveWrapper(Integer.class)); //true
System.out.println(ClassUtils.isPrimitiveWrapper(int.class)); //false
//检测是否是基本类型
System.out.println(Object.class.isPrimitive()); //false 注意 此处也是false
System.out.println(Integer.class.isPrimitive()); //false
System.out.println(int.class.isPrimitive()); //true
}
1234567891011121314
- isAssignable:是否是相同的class类型 支持class、数组等等 挺实用的
- isInnerClass:检查一个类是否是内部类或者静态内部类等
- getClass:加强版的Class.forName() 可以指定值是否要马上初始化该类
- hierarchy:获取到该类的继承结构
public static void main(String[] args) {
Iterable<Class<?>> hierarchy = ClassUtils.hierarchy(ArrayList.class);
hierarchy.forEach(System.out::println);
//输出了类的层级结构(默认是不包含接口的)
//class java.util.ArrayList
//class java.util.AbstractList
//class java.util.AbstractCollection
//class java.lang.Object
hierarchy = ClassUtils.hierarchy(ArrayList.class,ClassUtils.Interfaces.INCLUDE);
hierarchy.forEach(System.out::println);
//class java.util.ArrayList
//interface java.util.List
//interface java.util.Collection
//interface java.lang.Iterable
//interface java.util.RandomAccess
//interface java.lang.Cloneable
//interface java.io.Serializable
//class java.util.AbstractList
//class java.util.AbstractCollection
//class java.lang.Object
}
123456789101112131415161718192021
EnumUtils:辅助操作枚举的一些工具
- getEnum(Class enumClass, String enumName) 通过类返回一个枚举,可能返回空
- getEnumList(Class enumClass) 通过类返回一个枚举集合
- getEnumMap(Class enumClass) 通过类返回一个枚举map
- isValidEnum(Class enumClass, String enumName) 验证enumName是否在枚举中,返回true false
//枚举类
public enum ImagesTypeEnum {
JPG,JPEG,PNG,GIF;
}
//测试
ImagesTypeEnum imagesTypeEnum = EnumUtils.getEnum(ImagesTypeEnum.class, "JPG");
System.out.println("imagesTypeEnum = " + imagesTypeEnum);
System.out.println("--------------");
List<ImagesTypeEnum> imagesTypeEnumList = EnumUtils.getEnumList(ImagesTypeEnum.class);
imagesTypeEnumList.stream().forEach(
imagesTypeEnum1 -> System.out.println("imagesTypeEnum1 = " + imagesTypeEnum1)
);
System.out.println("--------------");
Map<String, ImagesTypeEnum> imagesTypeEnumMap = EnumUtils.getEnumMap(ImagesTypeEnum.class);
imagesTypeEnumMap.forEach((k, v) -> System.out.println("key:" + k + ",value:" + v));
System.out.println("-------------");
boolean result = EnumUtils.isValidEnum(ImagesTypeEnum.class, "JPG");
System.out.println("result = " + result);
boolean result1 = EnumUtils.isValidEnum(ImagesTypeEnum.class, null);
System.out.println("result1 = " + result1);
输出:
imagesTypeEnum = JPG
--------------
imagesTypeEnum1 = JPG
imagesTypeEnum1 = JPEG
imagesTypeEnum1 = PNG
imagesTypeEnum1 = GIF
--------------
key:JPG,value:JPG
key:JPEG,value:JPEG
key:PNG,value:PNG
key:GIF,value:GIF
-------------
result = true
result1 = false
12345678910111213141516171819202122232425262728293031323334353637
JavaVersion 枚举类,记录了java所有的版本号
RandomStringUtils : 需要随机字符串的时候,它或许能帮上忙
public static void main(String[] args) {
//随便随机一个字 所以有可能是乱码
String random = RandomStringUtils.random(10);
//在指定范围内随机
String randomChars = RandomStringUtils.random(3,'a','b','c','d','e');
//随便随机10个Ascii
String randomAscii = RandomStringUtils.randomAscii(10);
//注意这里不是5到10内随机,而是随机一个长度的数字
String randomNumeric = RandomStringUtils.randomNumeric(5,10);
System.out.println(random); //?ᣒ?⍝?䆃ぬ
System.out.println(randomChars); //dac
System.out.println(randomAscii); //hpCQrtmUvi
System.out.println(randomNumeric); //2580338
}
1234567891011121314
RandomUtils:这个不解释,如果你需要随机数字,用它吧。int、long、flort都是ok的
RegExUtils:处理字符串用正则替换等
- removeAll
- removeFirst
- removePattern
- replaceAll
- replaceFirst
SerializationUtils:对象的序列化工具。
在Json流行的时代,这个工具使用的几率就较小了。
- clone:采用字节数组ByteArrayInputStream来拷贝一个一模一样的对象
- serialize(final Serializable obj, final OutputStream outputStream) :可以把对象序列化到输出流里
- byte[] serialize(final Serializable obj):直接序列化成字节数组
- deserialize(final InputStream inputStream)、deserialize(final byte[] objectData)
SystemUtils:主要定义了一些系统底层的常量。比如类路径、操作系统、类型、java版本等等
StringUtils:处理字符串相关需求
public static boolean isEmpty(CharSequence cs)
这个可能用得是非常多的,null和空串都被定义为empty了哟
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false //注意这里是false
StringUtils.isEmpty("bob") = false
StringUtils.isEmpty(" bob ") = false
12345
public static boolean isAnyEmpty(CharSequence… css)
任意一个参数为空的话,返回true。如果这些参数都不为空的话返回false。在写一些判断条件的时候,这个方法还是很实用的。
StringUtils.isAnyEmpty(null) = true
StringUtils.isAnyEmpty(null, "foo") = true
StringUtils.isAnyEmpty("", "bar") = true
StringUtils.isAnyEmpty("bob", "") = true
StringUtils.isAnyEmpty(" bob ", null) = true
StringUtils.isAnyEmpty(" ", "bar") = false //注意这个是false哦
StringUtils.isAnyEmpty("foo", "bar") = false
1234567
public static boolean isNoneEmpty(CharSequence… css) 和isAnyEmpty取返
public static boolean isBlank(CharSequence cs)
判断字符对象是不是空字符串,注意与isEmpty的区别。相当于深度的isEmpty
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true //注意此处是null哦 这和isEmpty不一样的
StringUtils.isBlank("bob") = false
StringUtils.isBlank(" bob ") = false
12345
isAnyBlank、isNoneBlank这里就不再解释了
public static String trim(String str)
移除字符串两端的空字符串,制表符char <= 32如:\n \t 如果为null返回null
StringUtils.trim(null) = null
StringUtils.trim("") = ""
StringUtils.trim(" ") = ""
StringUtils.trim("abc") = "abc"
StringUtils.trim(" abc ") = "abc"
12345
变体有如下:
public static String trimToNull(String str) //如果是null就返回null,否则trim之后返回
public static String trimToEmpty(String str)
public static int ordinalIndexOf(CharSequence str, CharSequence searchStr,int ordinal)
这个方法有时候会很有用的。字符串在另外一个字符串里,出现第Ordinal次的位置
StringUtils.ordinalIndexOf("aabaabaa", "a", 1) = 0
StringUtils.ordinalIndexOf("aabaabaa", "a", 2) = 1
StringUtils.ordinalIndexOf("aabaabaa", "b", 1) = 2
StringUtils.ordinalIndexOf("aabaabaa", "b", 2) = 5
StringUtils.ordinalIndexOf("aabaabaa", "ab", 1) = 1
StringUtils.ordinalIndexOf("aabaabaa", "ab", 2) = 4
StringUtils.ordinalIndexOf("aabaabaa", "", 1) = 0 //空串永远访问0
StringUtils.ordinalIndexOf("aabaabaa", "", 2) = 0 //空串永远访问0
12345678
对应的有:lastOrdinalIndexOf方法
public static boolean containsAny(CharSequence cs,char… searchChars)
是否包含后面数组中的任意对象,返回true(和List里的containsAll有点像)
StringUtils.containsAny(null, *) = false
StringUtils.containsAny("", *) = false
StringUtils.containsAny(*, null) = false
StringUtils.containsAny(*, []) = false
StringUtils.containsAny("zzabyycdxx",['z','a']) = true
StringUtils.containsAny("zzabyycdxx",['b','y']) = true
StringUtils.containsAny("aba", ['z']) = false
1234567
public static String substring(String str,int start)
这个系列有的时候很有用,特别是下面的衍生方法:
//从左边开始截取指定个数
public static String left(String str,int len)
//从右边开始截取指定个数
public static String right(String str,int len)
//从中间的指定位置开始截取 指定个数
public static String mid(String str,int pos,int len)
123456
public static String join(T… elements)、public static String join(Object[] array,char separator)
默认使用空串Join
StringUtils.join(null) = null
StringUtils.join([]) = ""
StringUtils.join([null]) = ""
StringUtils.join(["a", "b", "c"]) = "abc"
StringUtils.join([null, "", "a"]) = "a"
12345
自定义符号:特定字符串连接数组,很多情况下还是蛮实用,不用自己取拼字符串
StringUtils.join(null, *) = null
StringUtils.join([], *) = ""
StringUtils.join([null], *) = ""
StringUtils.join(["a", "b", "c"], ';') = "a;b;c"
StringUtils.join(["a", "b", "c"], null) = "abc"
StringUtils.join([null, "", "a"], ';') = ";;a" //注意这里和上面的区别
123456
public static String deleteWhitespace(String str)
删除空格 这个方法还挺管用的。比trim给力
StringUtils.deleteWhitespace(null) = null
StringUtils.deleteWhitespace("") = ""
StringUtils.deleteWhitespace("abc") = "abc"
StringUtils.deleteWhitespace(" ab c ") = "abc"
1234
public static String removeStart(String str,String remove)
删除以特定字符串开头的字符串,如果没有的话,就不删除。
这个方法有时候很管用啊
StringUtils.removeStart(null, *) = null
StringUtils.removeStart("", *) = ""
StringUtils.removeStart(*, null) = *
StringUtils.removeStart("www.domain.com", "www.") = "domain.com"
StringUtils.removeStart("domain.com", "www.") = "domain.com"
StringUtils.removeStart("www.domain.com", "domain") = "www.domain.com" //注意这个结果哟 并没有删除任何东西
StringUtils.removeStart("abc", "") = "abc"
1234567
public static String rightPad(String str,int size,char padChar)
这个方法还是蛮管用的。对于生成统一长度的字符串的时候。
比如生成订单号,为了保证长度统一,可以右边自动用指定的字符补全至指定长度
StringUtils.rightPad(null, *, *) = null
StringUtils.rightPad("", 3, 'z') = "zzz"
StringUtils.rightPad("bat", 3, 'z') = "bat"
StringUtils.rightPad("bat", 5, 'z') = "batzz"
StringUtils.rightPad("bat", 1, 'z') = "bat"
StringUtils.rightPad("bat", -1, 'z') = "bat"
123456
对应的:leftPad 左边自动补全
public static String center(String str,int size)
将字符串扩展到指定的长度。把主体放在中间,两边自动用空串补齐
StringUtils.center(null, *) = null
StringUtils.center("", 4) = " "
StringUtils.center("ab", -1) = "ab"
StringUtils.center("ab", 4) = " ab "
StringUtils.center("abcd", 2) = "abcd"
StringUtils.center("a", 4) = " a "
123456
public static String capitalize(String str)、uncapitalize
首字母大、小写
public static String swapCase(String str)
去返大小写 大变小 小变大
StringUtils.swapCase(null) = null
StringUtils.swapCase("") = ""
StringUtils.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
123
public static boolean isAlpha(CharSequence cs)
判断字符串是否全由字母组成 (只要存在汉字、中文、数字都为false)
StringUtils.isAlpha(null) = false
StringUtils.isAlpha("") = false
StringUtils.isAlpha(" ") = false
StringUtils.isAlpha("abc") = true
StringUtils.isAlpha("ab2c") = false
StringUtils.isAlpha("ab-c") = false
123456
public static String reverse(String str)
字符串翻转
StringUtils.reverse(null) = null
StringUtils.reverse("") = ""
StringUtils.reverse("bat") = "tab"
123
public static String abbreviate(String str,int maxWidth)
缩略字符串,省略号要占三位。maxWith小于3位会报错。
这个在大篇幅需要显示的时候,很管用有木有
StringUtils.abbreviate(null, *) = null
StringUtils.abbreviate("", 4) = ""
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
StringUtils.abbreviate("abcdefg", 3) = IllegalArgumentException
1234567
高级用法:可以自定义缩略的部分内容角标
public static String wrap(String str,char wrapWith)
包装,用后面的字符串对前面的字符串进行包装
其实相当于前后拼了相同的串
StringUtils.wrap(null, *) = null
StringUtils.wrap("", *) = ""
StringUtils.wrap("ab", '\0') = "ab"
StringUtils.wrap("ab", 'x') = "xabx"
StringUtils.wrap("ab", '\'') = "'ab'"
StringUtils.wrap("\"ab\"", '\"') = "\"\"ab\"\""
123456
isAllBlank、isAllEmpty
这些都不解释了。处理数组可变参数而已
isAllLowerCase、isAllUpperCase
判断字符串所有字符是否都是大、小写
Q.E.D.