你只会用 StringBuilder/ StringBuffer 拼接字符串?java
那你就 OUT 了!!app
若是须要拼接分隔符的字符串,建议使用 Java 8 中的这款拼接神器:StringJoiner,你值得拥有。ui
字面上理解就是用来拼接字符串的,通常须要分隔符进行拼接,如:3d
hello, guys, 欢迎关注公众号Java技术栈code
这种三段式由 "," 分隔的字符串,在 Java 8 以前要使用 StringBuilder/ StringBuffer 进行拼接,如:blog
StringBuilder sb = new StringBuilder(); sb.append("hello"); sb.append(","); sb.append("guys"); sb.append(","); sb.append("欢迎关注公众号Java技术栈"); String str = sb.toString();
都是相同的分隔符逗号,这样拼接显然过于傻瓜式,若是要拼接的字符串很是多,代码会十分难看,写完感受要崩溃。事件
然而 Java 8 以后有了 StringJoiner,这件事件就变得更简单,分隔符这种所有一次性交给 StringJoiner 便可。字符串
StringJoiner 基本使用示例:get
public static void main(String[] args) { StringJoiner stringJoiner = new StringJoiner(","); stringJoiner.add("hello"); stringJoiner.add("guys"); stringJoiner.add("欢迎关注公众号Java技术栈"); System.out.println(stringJoiner.toString()); }
输出:源码
hello,guys,欢迎关注公众号Java技术栈
能够看到,这样写十分的干净清爽,也省去了许多没有必要的分隔符拼接操做,代码更优雅、只是可读性没 SB 直接拼接那么直观。
StringJoiner 就这么简单?
No!!!
StringJoiner 还有其余几种用法,下面的篇幅栈长会带你们解读一下。
StringJoiner 的类结构图:
它的父类就是 Object,这些成员变量和方法都有什么用呢?
成员变量:
prefix:拼接后的字符串前缀
delimiter:拼接时的字符串分隔符
suffix:拼接后的字符串后缀
value:拼接后的值
emptyValue:空值的状况,value为 null 时返回
构造方法:
提供了两个构造方法,一个必须带分隔符,另外一个必须带分隔符、前缀、后缀,能够看了 emptyValue
默认为前缀+后缀组成。
公开方法:
setEmptyValue:设置空值
toString:转换成 String
add:添加字符串
merge:从另外一个 StringJoiner 合并
length:长度(包括前缀后缀)
咱们重点看下 add 方法源码:
能够看到内部其实就是用的 StringBuilder 进行封装的,首次建立会先拼接前缀,后续先添加分隔符,再添加字符串。
其实 String 底层也是用的 StringBuilder,具体能够关注公众号Java技术栈在 Java 核心技术系列专栏中进行阅读。
另一点,add 方法就是返回 StringJoiner 自己,因此能够像StringBuilder/ StringBuffer 同样进行流式处理。
如上面的示例一行代码搞定:
public static void main(String[] args) { StringJoiner stringJoiner = new StringJoiner(",").add("hello").add("guys").add("欢迎关注公众号Java技术栈"); System.out.println(stringJoiner.toString()); }
在示例中须要指定先后缀:
public static void main(String[] args) { StringJoiner stringJoiner = new StringJoiner(",", "[", "]"); stringJoiner.add("hello"); stringJoiner.add("guys"); stringJoiner.add("欢迎关注公众号Java技术栈"); System.out.println(stringJoiner.toString()); }
输出:
[hello,guys,欢迎关注公众号Java技术栈]
如上所示,先后都带中括号进行了包装。
没有拼接任何字符串的几个空值处理场景。
输出空白字符串:
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() 这是针对 StringJoiner 又封装了一层的 API,一样出自 Java 8,能够传入动态参数或者迭代器。
java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)
java.lang.String#join(java.lang.CharSequence, java.lang.Iterable<? extends java.lang.CharSequence>)
源码以下:
看源码,这两个方法只能进行简单的拼接操做,不能添加先后缀、空值设置处理等。
来个示例:
public static void main(String[] args) { String str = String.join(",", "hello", "guys", "欢迎关注公众号Java技术栈"); System.out.println(str); }
能够看到,简单处理这样使用更简便。
今天介绍了 StringJoiner、StringBuilder、String.join() 之间的关系及使用。在使用拼间多个相同的分隔符时,使用 StringJoiner,简单处理使用 String.join() 也能完成。
针对不一样的场景使用不一样的 API,这才是最佳最优雅的处理方式,不要只会使用 StringBuilder!