不过最近给其 Review 代码的时候,有些代码逻辑有些繁琐,有些代码看来可以用一些开源工具类实现,不需要自己重复实现
下文主要分享这几个方向的常用工具类:
字符串相关工具类
Java 中 String 应该是日常用的最多一个类吧,平常我们很多代码需要围绕 String ,做一些处理。
JDK 提供 String API 虽然比较多,但是功能比较基础,通常我们需要结合 String 多个方法才能完成一个业务功能。
下面介绍一下 Apache 提供的一个工具类 StringUtils.
Maven Pom 信息如下:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
commons-lang 有两个版本,一个是 commons-lang3 ,一个是 commons-lang 。
commons-lang 是老版本,已经很久没有维护了。
commons-lang3 是一直在维护的版本,推荐直接使用这个版本。
注意:如果你系统已经有 commons-lang,注意如果直接替换成 commons-lang3,将会编译错误。commons-lang3 中相关类与 commons-lang 一样,但是包名不一样。
判断字符串是否为空
判断字符串是否为空,想必每个人应该都写过吧:
if (null == str || str.isEmpty()) {
}
虽然这段代码非常简单,但是说实话,阿粉以前还是在这里犯过空指针的异常的。
使用 StringUtils ,上面代码可以替换下面这样:
if (StringUtils.isEmpty(str)) {
}
StringUtils 内部还有一个方法 isBlank,也是用来判断字符串是否为空,两个方法比较相近,比较搞混,主要区别如下:
// 如果字符串都是空格的话,
StringUtils.isBlank(" ") = true;
StringUtils.isEmpty(" ") = false;
判断字符串是否为空,使用频率非常高,这里大家可以使用 IDEA Prefix 的功能,输入直接生成判空语句。
字符串固定长度
这个通常用于字符串需要固定长度的场景,比如需要固定长度字符串作为流水号,若流水号长度不足,,左边补 0 。
这里当然可以使用 String#format 方法,不过阿粉觉得比较麻烦,这里可以这样使用:
// 字符串固定长度 8位,若不足,往左补 0
StringUtils.leftPad("test", 8, "0");
另外还有一个 StringUtils#rightPad,这个方法与上面方法正好相反。
字符串关键字替换
StringUtils 提供一些列的方法,可以替换某些关键字:在这里插入代码片
// 默认替换所有关键字
StringUtils.replace("aba", "a", "z") = "zbz";
// 替换关键字,仅替换一次
StringUtils.replaceOnce("aba", "a", "z") = "zba";
// 使用正则表达式替换
StringUtils.replacePattern("ABCabc123", "[^A-Z0-9]+", "") = "ABC123";
....
字符串拼接
字符串拼接是个常见的需求,简单办法使用 StringBuilder 循环遍历拼接:
String[] array = new String[]{"test", "1234", "5678"};
StringBuilder stringBuilder = new StringBuilder();
for (String s : array) {
stringBuilder.append(s).append(";");
}
// 防止最终拼接字符串为空
if (stringBuilder.length() > 0) {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
System.out.println(stringBuilder.toString());
上面业务代码不太难,但是需要注意一下上面这段代码非常容易出错,容易抛出 StringIndexOutOfBoundsException。
这里我们可以直接使用以下方法获取拼接之后字符串:
StringUtils.join(["a", "b", "c"], ",") = "a,b,c"
StringUtils 只能传入数组拼接字符串,不过我比较喜欢集合拼接,所以再推荐下 Guava 的 Joiner。
实例代码如下:
String[] array = new String[]{"test", "1234", "5678"};
List<String> list=new ArrayList<>();
list.add("test");
list.add("1234");
list.add("5678");
StringUtils.join(array, ",");
// 逗号分隔符,跳过 null
Joiner joiner=Joiner.on(",").skipNulls();
joiner.join(array);
joiner.join(list);
字符串拆分
有字符串拼接,就会有拆分字符串的需求,同样的 StringUtils 也有拆分字符串的方法
StringUtils.split("a..b.c", '.') = ["a", "b", "c"]
StringUtils.splitByWholeSeparatorPreserveAllTokens("a..b.c", ".")= ["a","", "b", "c"]
ps:注意以上两个方法区别。
StringUtils 拆分之后得到是一个数组,我们可以使用 Guava 的
Splitter splitter = Splitter.on(",");
// 返回是一个 List 集合,结果:[ab, , b, c]
splitter.splitToList("ab,,b,c");
// 忽略空字符串,输出结果 [ab, b, c]
splitter.omitEmptyStrings().splitToList("ab,,b,c")
StringUtils 内部还有其他常用的方法,小伙伴可以自行查看其 API。
日期相关工具类