你只会用 StringBuilder?试试 StringJoiner,真香!

Hollis

共 2690字,需浏览 6分钟

 ·

2020-12-06 21:24

你只会用 StringBuilder/ StringBuffer 拼接字符串?

那你就 OUT 了!!

如果需要拼接分隔符的字符串,建议使用 Java 8 中的这款拼接神器:StringJoiner,你值得拥有。

 

StringJoiner 基本使用

字面上理解就是用来拼接字符串的,一般需要分隔符进行拼接,如:

hello, guys, AAA

这种三段式由 "," 分隔的字符串,在 Java 8 之前要使用 StringBuilder/ StringBuffer 进行拼接,如:

StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(",");
sb.append("guys");
sb.append(",");
sb.append("AAA");
String str = sb.toString();

都是相同的分隔符逗号,这样拼接显然过于傻瓜式,如果要拼接的字符串非常多,代码会十分难看,写完感觉要崩溃。

然而 Java 8 之后有了 StringJoiner,这件事件就变得更简单,分隔符这种全部一次性交给 StringJoiner 即可。

StringJoiner 基本使用示例:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",");
 stringJoiner.add("hello");
 stringJoiner.add("guys");
 stringJoiner.add("AAA");
 System.out.println(stringJoiner.toString());
}

输出:

hello,guys,AAA

可以看到,这样写十分的干净清爽,也省去了许多没有必要的分隔符拼接操作,代码更优雅、只是可读性没 SB 直接拼接那么直观。

StringJoiner 就这么简单?

No!!!

StringJoiner 还有其他几种用法,下面的篇幅栈长会带大家解读一下。

 

StringJoiner 详细介绍

StringJoiner 的类结构图:


它的父类就是 Object,这些成员变量和方法都有什么用呢?

成员变量:

  • prefix:拼接后的字符串前缀

  • delimiter:拼接时的字符串分隔符

  • suffix:拼接后的字符串后缀

  • value:拼接后的值

  • emptyValue:空值的情况,value为 null 时返回

构造方法:

提供了两个构造方法,一个必须带分隔符,另一个必须带分隔符、前缀、后缀,可以看了 emptyValue 默认为前缀+后缀组成。

公开方法:

  • setEmptyValue:设置空值

  • toString:转换成 String

  • add:添加字符串

  • merge:从另一个 StringJoiner 合并

  • length:长度(包括前缀后缀)

 

流式 API

我们重点看下 add 方法源码:

可以看到内部其实就是用的 StringBuilder 进行封装的,首次创建会先拼接前缀,后续先添加分隔符,再添加字符串。

其实 String 底层也是用的 StringBuilder

另外一点,add 方法就是返回 StringJoiner 本身,所以可以像 StringBuilder/ StringBuffer 一样进行流式处理。

如上面的示例一行代码搞定:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",").add("hello").add("guys").add("AAA");
 System.out.println(stringJoiner.toString());
}



前后缀拼接

在示例中需要指定前后缀:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",""[""]");
 stringJoiner.add("hello");
 stringJoiner.add("guys");
 stringJoiner.add("AAA");
 System.out.println(stringJoiner.toString());
}

输出:

[hello,guys,AAA]

如上所示,前后都带中括号进行了包装。

 

空值处理

没有拼接任何字符串的几个空值处理场景。

输出空白字符串:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",");
 System.out.println(stringJoiner.toString());
}

输出前后缀:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",""[""]");
}

输出:

[]

输出指定字符串:

通过 setEmptyValue 进行设置。

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",""[""]");
 stringJoiner.setEmptyValue("void");
 System.out.println(stringJoiner.toString());
}

输出:

void

 

String.join()

String.join() 这是针对 StringJoiner 又封装了一层的 API,同样出自 Java 8,可以传入动态参数或者迭代器。

  • java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)

  • java.lang.String#join(java.lang.CharSequence, java.lang.Iterable)

源码如下:

看源码,这两个方法只能进行简单的拼接操作,不能添加前后缀、空值设置处理等。

来个示例:

public static void main(String[] args) {
 String str = String.join(",""hello""guys""AAA");
 System.out.println(str);
}

可以看到,简单处理这样使用更简便。

 

总结

今天介绍了 StringJoiner、StringBuilder、String.join() 之间的关系及使用。在使用拼间多个相同的分隔符时,使用 StringJoiner,简单处理使用 String.join() 也能完成。

针对不同的场景使用不同的 API,这才是最佳最优雅的处理方式,不要只会使用 StringBuilder!


有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号


好文章,我在看❤️

浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报