你只会用 StringBuilder?试试 StringJoiner,真香!
你只會用 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<? extends java.lang.CharSequence>)
源碼如下:
看源碼,這兩個方法只能進行簡單的拼接操作,不能添加前后綴、空值設置處理等。
來個示例:
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之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的你只会用 StringBuilder?试试 StringJoiner,真香!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 代码集锦之图片处理
- 下一篇: 新概念 Lesson 7 A new d