首发csdn,osc延后更新
在字符串处理操作中,非常常用的一个功能是将一个字符串数组或者字符串集合使用某种分隔符拼接为单一的字符串(需要注意拼接操作往往是不可逆的)。除了丑陋的自己写之外,常用的方式还有下面几种:
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 list = Arrays.asList(array);
return new Object[][] { new Object[] { array, list } };
}
@Test(dataProvider = "list")
public void testJava8Join(String[] array, List 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 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 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));
}
}