还在用StringBuilder进行字符串拼接?那你就OUT了

我们在开发中会经常拼接字符串,例如我们现在有一个数组:

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拼接,复杂的拼接我们可以使用StringJoinerCollectors.joiningJoiner.on等方法。他们的底层都用到了StringBuilder。如果你打算使用StringBuilder拼接字符串,可以考虑这些方法。

往期推荐

扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料

  1. 回复"java" 获取java电子书;

  2. 回复"python"获取python电子书;

  3. 回复"算法"获取算法电子书;

  4. 回复"大数据"获取大数据电子书;

  5. 回复"spring"获取SpringBoot的学习视频。

  6. 回复"面试"获取一线大厂面试资料

  7. 回复"进阶之路"获取Java进阶之路的思维导图

  8. 回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

  9. 回复"总结"获取Java后端面试经验总结PDF版

  10. 回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

  11. 回复"并发导图"获取Java并发编程思维导图(xmind终极版)

另:点击【我的福利】有更多惊喜哦。

猜你喜欢

转载自blog.csdn.net/wujialv/article/details/111038703