1. 程式人生 > >你只會用 StringBuilder?試試 StringJoiner,真香!

你只會用 StringBuilder?試試 StringJoiner,真香!

你只會用 StringBuilder/ StringBuffer 拼接字串? 那你就 OUT 了!! 如果需要拼接分隔符的字串,建議使用 Java 8 中的這款拼接神器:StringJoiner,你值得擁有。 ## StringJoiner 基本使用 字面上理解就是用來拼接字串的,一般需要分隔符進行拼接,如: > hello, guys, 歡迎關注公眾號Java技術棧 這種三段式由 "," 分隔的字串,在 Java 8 之前要使用 StringBuilder/ StringBuffer 進行拼接,如: ``` 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 基本使用示例:** ``` 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 詳細介紹 StringJoiner 的類結構圖: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201118105438091-373427204.png) 它的父類就是 Object,這些成員變數和方法都有什麼用呢? **成員變數:** - prefix:拼接後的字串字首 - delimiter:拼接時的字串分隔符 - suffix:拼接後的字串字尾 - value:拼接後的值 - emptyValue:空值的情況,value為 null 時返回 **構造方法:** ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201118105438426-35810512.png) 提供了兩個構造方法,一個必須帶分隔符,另一個必須帶分隔符、字首、字尾,可以看了 `emptyValue` 預設為字首+字尾組成。 **公開方法:** - setEmptyValue:設定空值 - toString:轉換成 String - add:新增字串 - merge:從另一個 StringJoiner 合併 - length:長度(包括字首字尾) ## 流式 API 我們重點看下 add 方法原始碼: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201118105438632-580834993.png) ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201118105438817-385646166.png) 可以看到內部其實就是用的 [StringBuilder]( https://mp.weixin.qq.com/s/Eeb9wa0DfUs9U5snahAJZQ) 進行封裝的,首次建立會先拼接字首,後續先新增分隔符,再新增字串。 其實 String 底層也是用的 [StringBuilder]( https://mp.weixin.qq.com/s/Eeb9wa0DfUs9U5snahAJZQ),具體可以關注公眾號Java技術棧在 Java 核心技術系列專欄中進行閱讀。 另外一點,add 方法就是返回 StringJoiner 本身,所以可以像 [StringBuilder/ StringBuffer](https://mp.weixin.qq.com/s/Eeb9wa0DfUs9U5snahAJZQ) 一樣進行流式處理。 如上面的示例一行程式碼搞定: ``` 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() 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) 原始碼如下: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201118105439040-1034031321.png) 看原始碼,這兩個方法只能進行簡單的拼接操作,不能新增前後綴、空值設定處理等。 來個示例: ``` 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! 這是 Java 8 系列的第 ? 篇文章了?棧長我也記不清了 ,但絕對不是最後一篇,看往期新特性教程在公眾號Java技術棧回覆新特性即可。 去我的部落格網站也可以看往期系列教程: > http://www.javastack.cn/ 最後,希望對大家有幫助,後面我會繼續分享好玩的 Java 技術,關注公眾號第一時間推送。 覺得有用,三連走起哦~ > 版權申明:本文系公眾號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重他人勞動成果和智慧財產權。 **近期熱文推薦:** 1.[Java 15 正式釋出, 14 個新特性,重新整理你的認知!!](http://www.javastack.cn/article/2020/java15-released/) 2.[終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!](http://www.javastack.cn/article/2020/intellij-idea-by-open-source-project/) 3.[我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。](http://www.javastack.cn/article/2020/java-8-optional-map-do-you-know/) 4.[吊打 Tomcat ,Undertow 效能很炸!!](http://www.javastack.cn/article/2020/undertow-introduce-with-spring-boot/) 5.[《Java開發手冊(嵩山版)》最新發布,速速下載!](http://www.javastack.cn/article/2020/alibaba-release-java-develop-rules-songshan/) 覺得不錯,別忘了隨手點贊+轉