你只會(huì)用 StringBuilder?試試 StringJoiner,真香!

Java技術(shù)棧
www.javastack.cn
關(guān)注閱讀更多優(yōu)質(zhì)文章
號(hào)外:Java 15 正式發(fā)布, 14 個(gè)新特性!
你只會(huì)用 StringBuilder/ StringBuffer 拼接字符串?
那你就 OUT 了?。?/p>
如果需要拼接分隔符的字符串,建議使用 Java 8 中的這款拼接神器:StringJoiner,你值得擁有。
StringJoiner 基本使用
字面上理解就是用來拼接字符串的,一般需要分隔符進(jìn)行拼接,如:
hello, guys, 歡迎關(guān)注公眾號(hào)Java技術(shù)棧
這種三段式由 "," 分隔的字符串,在 Java 8 之前要使用 StringBuilder/ StringBuffer 進(jìn)行拼接,如:
StringBuilder?sb?=?new?StringBuilder();
sb.append("hello");
sb.append(",");
sb.append("guys");
sb.append(",");
sb.append("歡迎關(guān)注公眾號(hào)Java技術(shù)棧");
String?str?=?sb.toString();
都是相同的分隔符逗號(hào),這樣拼接顯然過于傻瓜式,如果要拼接的字符串非常多,代碼會(huì)十分難看,寫完感覺要崩潰。
然而 Java 8 之后有了 StringJoiner,這件事件就變得更簡(jiǎn)單,分隔符這種全部一次性交給 StringJoiner 即可。
StringJoiner 基本使用示例:
public?static?void?main(String[]?args)?{
?StringJoiner?stringJoiner?=?new?StringJoiner(",");
?stringJoiner.add("hello");
?stringJoiner.add("guys");
?stringJoiner.add("歡迎關(guān)注公眾號(hào)Java技術(shù)棧");
?System.out.println(stringJoiner.toString());
}
輸出:
hello,guys,歡迎關(guān)注公眾號(hào)Java技術(shù)棧
可以看到,這樣寫十分的干凈清爽,也省去了許多沒有必要的分隔符拼接操作,代碼更優(yōu)雅、只是可讀性沒 SB 直接拼接那么直觀。
StringJoiner 就這么簡(jiǎn)單?
No!!!
StringJoiner 還有其他幾種用法,下面的篇幅棧長(zhǎng)會(huì)帶大家解讀一下。
StringJoiner 詳細(xì)介紹
StringJoiner 的類結(jié)構(gòu)圖:

它的父類就是 Object,這些成員變量和方法都有什么用呢?
成員變量:
prefix:拼接后的字符串前綴 delimiter:拼接時(shí)的字符串分隔符 suffix:拼接后的字符串后綴 value:拼接后的值 emptyValue:空值的情況,value為 null 時(shí)返回
構(gòu)造方法:

提供了兩個(gè)構(gòu)造方法,一個(gè)必須帶分隔符,另一個(gè)必須帶分隔符、前綴、后綴,可以看了 emptyValue 默認(rèn)為前綴+后綴組成。
公開方法:
setEmptyValue:設(shè)置空值 toString:轉(zhuǎn)換成 String add:添加字符串 merge:從另一個(gè) StringJoiner 合并 length:長(zhǎng)度(包括前綴后綴)
流式 API
我們重點(diǎn)看下 add 方法源碼:


可以看到內(nèi)部其實(shí)就是用的 StringBuilder 進(jìn)行封裝的,首次創(chuàng)建會(huì)先拼接前綴,后續(xù)先添加分隔符,再添加字符串。
其實(shí) String 底層也是用的 StringBuilder,具體可以關(guān)注公眾號(hào)Java技術(shù)棧在 Java 核心技術(shù)系列專欄中進(jìn)行閱讀。
另外一點(diǎn),add 方法就是返回 StringJoiner 本身,所以可以像 StringBuilder/ StringBuffer 一樣進(jìn)行流式處理。
如上面的示例一行代碼搞定:
public?static?void?main(String[]?args)?{
?StringJoiner?stringJoiner?=?new?StringJoiner(",").add("hello").add("guys").add("歡迎關(guān)注公眾號(hào)Java技術(shù)棧");
?System.out.println(stringJoiner.toString());
}
前后綴拼接
在示例中需要指定前后綴:
public?static?void?main(String[]?args)?{
?StringJoiner?stringJoiner?=?new?StringJoiner(",",?"[",?"]");
?stringJoiner.add("hello");
?stringJoiner.add("guys");
?stringJoiner.add("歡迎關(guān)注公眾號(hào)Java技術(shù)棧");
?System.out.println(stringJoiner.toString());
}
輸出:
[hello,guys,歡迎關(guān)注公眾號(hào)Java技術(shù)棧]
如上所示,前后都帶中括號(hào)進(jìn)行了包裝。
空值處理
沒有拼接任何字符串的幾個(gè)空值處理場(chǎng)景。
輸出空白字符串:
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 進(jìn)行設(shè)置。
public?static?void?main(String[]?args)?{
?StringJoiner?stringJoiner?=?new?StringJoiner(",",?"[",?"]");
?stringJoiner.setEmptyValue("void");
?System.out.println(stringJoiner.toString());
}
輸出:
void
String.join()
String.join() 這是針對(duì) StringJoiner 又封裝了一層的 API,同樣出自 Java 8,可以傳入動(dòng)態(tài)參數(shù)或者迭代器。
java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...) java.lang.String#join(java.lang.CharSequence, java.lang.Iterable extends java.lang.CharSequence>)
源碼如下:

看源碼,這兩個(gè)方法只能進(jìn)行簡(jiǎn)單的拼接操作,不能添加前后綴、空值設(shè)置處理等。
來個(gè)示例:
public?static?void?main(String[]?args)?{
?String?str?=?String.join(",",?"hello",?"guys",?"歡迎關(guān)注公眾號(hào)Java技術(shù)棧");
?System.out.println(str);
}
可以看到,簡(jiǎn)單處理這樣使用更簡(jiǎn)便。
總結(jié)
今天介紹了 StringJoiner、StringBuilder、String.join() 之間的關(guān)系及使用。在使用拼間多個(gè)相同的分隔符時(shí),使用 StringJoiner,簡(jiǎn)單處理使用 String.join() 也能完成。
針對(duì)不同的場(chǎng)景使用不同的 API,這才是最佳最優(yōu)雅的處理方式,不要只會(huì)使用 StringBuilder!
這是 Java 8 系列的第 ?篇文章了?棧長(zhǎng)我也記不清了 ,但絕對(duì)不是最后一篇,看往期新特性教程在公眾號(hào)Java技術(shù)?;貜?fù)新特性即可。
去我的博客網(wǎng)站也可以看往期系列教程:
http://www.javastack.cn/
最后,希望對(duì)大家有幫助,后面我會(huì)繼續(xù)分享好玩的 Java 技術(shù),關(guān)注公眾號(hào)第一時(shí)間推送。
支持棧長(zhǎng)持續(xù)輸出,平時(shí)我也會(huì)接一些廣告推廣,我一直堅(jiān)守底線,不會(huì)什么廣告都接,都是對(duì)大家有幫助的課程、免費(fèi)資料之類的,還請(qǐng)大家多多包含哦!
覺得有用,三連走起哦~
版權(quán)申明:本文系公眾號(hào) "Java技術(shù)棧" 原創(chuàng),原創(chuàng)實(shí)屬不易,轉(zhuǎn)載、引用本文內(nèi)容請(qǐng)注明出處,禁止抄襲、洗稿,請(qǐng)自重,尊重他人勞動(dòng)成果和知識(shí)產(chǎn)權(quán)。






關(guān)注Java技術(shù)棧看更多干貨



