我们在开发中会经常拼接字符串,例如我们现在有一个数组:
private static final String[] names = {"我", "大意了啊", "年轻人", "不讲武德", "来骗"};
我们需要将元素提取出来,然后拼接成一个整字符串,目标效果如下:
我, 大意了啊, 年轻人, 不讲武德, 来骗
"+"拼接
那么,你准备怎么做:
@Test
public void test() {
String str = names[0] +","+ names[1] +","+ names[2] +","+ names[3] +","+ names[4];
System.out.println(str);
}
大部分人会这么做,但是我们发现里面有太重复的"," 和"+"了。感觉拼接不是很灵活。
StringBuilder拼接
于是我们有了新的做法,使用StringBuilder来拼接:
StringBuilder sb = new StringBuilder();
sb.append(names[0]);
sb.append(",");
sb.append(names[1]);
sb.append(",");
sb.append(names[2]);
sb.append(",");
sb.append(names[3]);
sb.append(",");
sb.append(names[4]);
System.out.println(sb.toString());
这样虽然省了"+",但是","还是有很多,代码不够优雅。想到这里,你可能会使用for
循环:
StringBuilder sb2 = new StringBuilder();
int length = names.length;
for (int i = 0; i < length; i++) {
sb2.append(names[i]);
if (i != length - 1) {
sb2.append(",");
}
}
这样写貌似不错,但还是写得很复杂,还要考虑末尾的处理。
concat()拼接
简单的拼接也可以使用concat()
方法:
public void test() {
String str = "Lvshen";
String concat = str.concat(",").concat("Hello");
System.out.println(concat);
}
//输出
//Lvshen,Hello
String.join()拼接
我们再来一个一步到位的方法:
public void test() {
String str = String.join(",", names[0], names[1], names[2], names[3], names[4]);
System.out.println(str);
}
这样我们也能实现效果。
我,大意了啊,年轻人,不讲武德,来骗
String.join()
是Java8后面的一个方法,简单好用。源码如下:
大家发现了没有,里面用的StringJoiner
实现拼接。
现在我们有这样一个需求,要求拼接结果为:
[我,大意了啊,年轻人,不讲武德,来骗]
在之前的基础上添加"[ ]",如果我们直接用"+"或者StringBuilder
。实现还是很繁琐,当然将繁琐的实现抽出成一个方法也不错,方便日后复用。
其实拼接的大部分轮子已经实现,我们来看看几个常用的API。
StringJoiner拼接
上面提到的StringJoiner
就可以实现这个需求:
public void test() {
StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
for (String name : names) {
stringJoiner.add(name);
}
System.out.println(stringJoiner.toString());
}
new StringJoiner(",", "[", "]");
表示以","隔开,前缀为"[",后缀为"]"。运行结果如下:
[我,大意了啊,年轻人,不讲武德,来骗]
StringJoiner
的底层用的还是StringBuilder
。
上面的方法还是觉得很麻烦,我想省掉for循环。那我们就要采用别的方法。
Collectors.joining拼接
我们可以使用Collectors.joining
来拼接,也是Java8的特性:
Stream<String> stream1 = Stream.of(names);
// 拼接成 [x, y, z] 形式
String result1 = stream1.collect(Collectors.joining(", ", "[", "]"));
也能实现效果:
[我,大意了啊,年轻人,不讲武德,来骗]
当然也可以一步到位:
Stream.of(names).collect(Collectors.joining(", ", "[", "]"));
相比之前的String.join
:
String str = String.join(",", names[0], names[1], names[2], names[3], names[4]);
不用一个一个获取数组里面的元素,方便了很多。
Joiner.on拼接
除了用Java8的拼接方式,我们还可以使用大名顶顶的google框架:Guava。首先先要引入Maven依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
现在来写一个使用示例:
Joiner joiner = Joiner.on(",").skipNulls();
String join = joiner.join("公众号", null, "Lvshen的技术小屋");
System.out.println("join:" + join);
我们使用Joiner.on()
,这个方法可以过滤掉值为null的元素,如上代码执行结果为:
join:公众号,Lvshen的技术小屋
当然有时候会有变态需求,不过滤为null的值,需要将null元素替换为其他值,如空串" "。
Joiner joiner1 = Joiner.on(",").useForNull("");
String content1 = joiner1.join("公众号", null, "Lvshen的技术小屋", "欢迎订阅");
System.out.println("content1:" + content1);
useForNull()
就是用来替换null值的。运行如下:
content1:公众号,,Lvshen的技术小屋,欢迎订阅
总结
在平时开发中我们不是一定要使用"+"或者StringBuilder拼接,复杂的拼接我们可以使用StringJoiner
,Collectors.joining
,Joiner.on
等方法。他们的底层都用到了StringBuilder。如果你打算使用StringBuilder拼接字符串,可以考虑这些方法。