Java 8 在 java.util 包中引入了新的工具类 StringJoiner,主要用于拼接带有指定分隔符的多个字符串,同时还可以指定前缀、后缀、默认值。

1
2
3
4
5
List<String> mystring = new ArrayList<>(4);
mystring.add("Logan");
mystring.add("Magneto");
mystring.add("Rogue");
mystring.add("Storm");

假设需要将上面的 String 数组中成员用逗号连接后输出,目标效果如下:

1
Logan, Magneto, Rogue, Storm

使用 StringBuilder 方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
StringBuilder builder = new StringBuilder();

for (int i = 0; i < mystring.size(); i++){
builder.append(mystring.get(i));
if (i < mystring.size() - 1){
builder.append(", ");
}
}

System.out.println(builder.toString());

//或者
builder = new StringBuilder();
for (String s : mystring){
builder.append(s).append(", ");
}
builder.replace(builder.lastIndexOf(", "),builder.length(),"");

System.out.println(builder.toString());

为了不在字符串的结尾也带上括号,不得不在每次拼接对象时判断当前对象是否为最后一个,或者在拼接完成后将最后的逗号去掉。

使用 StringJoiner 方式

1
2
3
4
5
StringJoiner joiner = new StringJoiner(", ");

mystring.forEach(joiner::add);

System.out.println(joiner.toString());

无论是代码的可读性还是代码长度,StringJoiner 都更胜一筹。

What’s more?

除了设置分隔符以外,还可以给拼接器设置前后缀,StringJoiner 的另一种构造函数:

1
public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)

还可以为整个拼接器设置默认字符值,即当整个拼接器没有包含任何对象时,拼接器本身可以输出一个默认值,而不是输出空字符串或 Null:

1
2
3
StringJoiner stringJoiner = new StringJoiner("-");
stringJoiner.setEmptyValue("[Default value]");
System.out.println(stringJoiner.toString());

输出:

1
[Default value]

带有合并方法,可以合并多个连接器,被合并的连接器贝当作整个对象添加进列表中,被合并对象的前后缀都被忽略:

1
2
3
4
5
6
7
StringJoiner joiner1 = new StringJoiner(", ","[","]");
joiner1.add("Logan").add("Magneto").add("Rouge").add("Storm");
StringJoiner joiner2 = new StringJoiner("-", "{", "}");
joiner2.add("Apple").add("Banana").add("Orange");
System.out.println("Joiner1:" + joiner1.toString());
System.out.println("Joiner2:" + joiner2.toString());
System.out.println("Joiner2 merge Joiner1:" + joiner2.merge(joiner1).toString());

输出:

1
2
3
Joiner1:[Logan, Magneto, Rouge, Storm]
Joiner2:{Apple-Banana-Orange}
Joiner2 merge joiner1:{Apple-Banana-Orange-Logan, Magneto, Rouge, Storm}