在字符串处理操作中,非常常用的一个功能是将一个字符串数组或者字符串集合使用某种分隔符拼接为单一的字符串(需要注意拼接操作往往是不可逆的)。除了丑陋的自己写之外,常用的方式还有下面几种:
1. Java8的String.join
2. Guava的Joiner
3. Apache commons-lang3的StringUtils
这3者都能实现最基本的功能,但是在细节上还是有很多不同,使用时值得注意选择。简要说起来主要区别如下:
1. Java8的String.join实现最简单,但是它会将null输出为"null"
2. Guava的Joiner提供的连贯接口,如果不指定如何处理null则遇到null时会抛出NPE,可以指定跳过null,也可以指定将null转换为何种字符串
3. Apache commons-lang3的StringUtils提供的方法直接将null转换为空字符串,对于数组输入可以指定只拼接其中一部分
下面是代码和对应的输出
package blog.java;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.common.base.Joiner;
public class S14 {
@DataProvider
public Object[][] list() {
String[] array = { "a", "b", null, "c", "", "d" };
List<String> list = Arrays.asList(array);
return new Object[][] { new Object[] { array, list } };
}
@Test(dataProvider = "list")
public void testJava8Join(String[] array, List<String> list) {
// "a, b, null, c, , d"
System.out.println(String.join(", ", array));
// "a, b, null, c, , d"
System.out.println(String.join(", ", list));
}
@Test(dataProvider = "list")
public void testLang3StringUtils(String[] array, List<String> list) {
// "a, b, , c, , d"
System.out.println(StringUtils.join(array, ", "));
// "a, b, , c, , d"
System.out.println(StringUtils.join(list, ", "));
// "a, b, , c"
System.out.println(StringUtils.join(array, ", ", 0, 4));
}
@Test(dataProvider = "list")
public void testGuavaJoiner(String[] array, List<String> list) {
// java.lang.NullPointerException
System.out.println(Joiner.on(", ").join(array));
// java.lang.NullPointerException
System.out.println(Joiner.on(", ").join(list));
// "a, b, c, , d"
System.out.println(Joiner.on(", ").skipNulls().join(array));
// "a, b, c, , d"
System.out.println(Joiner.on(", ").skipNulls().join(list));
// "a, b, nullString, c, , d"
System.out.println(Joiner.on(", ").useForNull("nullString").join(array));
// "a, b, nullString, c, , d"
System.out.println(Joiner.on(", ").useForNull("nullString").join(list));
}
}
Java8、Guava、Apache Commons Lang3字符串拼接比较
本文对比了Java8的String.join、Guava的Joiner和Apache Commons Lang3的StringUtils在字符串拼接功能上的实现方式、细节差异及使用建议。

被折叠的 条评论
为什么被折叠?



