Java實(shí)用工具之StringJoiner詳解
背景
在平時(shí)的業(yè)務(wù)開發(fā)中,我們可能會(huì)遇到字符串列表根據(jù)分隔符進(jìn)行拼接的需求。比如:
輸入:
數(shù)組:[“a”,“b”,“c”]分隔符:","輸出:
“a,b,c”
處理
通常我們可以使用StringBuilder根據(jù)下標(biāo)位置決定是否需要添加分隔符以達(dá)到目的,比如:
public static void main(String[] args) { StringBuilder sb = new StringBuilder(); String[] strings = new String[]{"a", "b", "c"}; String delimiter = ","; for (int i = 0; i < strings.length; i++) { if (i != 0) { sb.append(delimiter); } sb.append(strings[i]); } System.out.println(sb.toString()); }
或者:
public static void main(String[] args) { StringBuilder sb = new StringBuilder(); String[] strings = new String[]{"a", "b", "c"}; String delimiter = ","; int tmp = strings.length - 1; for (int i = 0; i < strings.length; i++) { sb.append(strings[i]); if (i != tmp) { sb.append(delimiter); } } System.out.println(sb.toString()); }
但是每次遇到這種情況都去這樣拼接很麻煩,而且如果使用迭代器,沒有下標(biāo)就不能使用這種方法。那么就每次append分隔符,最后再截?cái)啵?/p>
public static void main(String[] args) { StringBuilder sb = new StringBuilder(); String[] strings = new String[]{"a", "b", "c"}; String delimiter = ","; for (String str:strings) { sb.append(str).append(delimiter); } System.out.println(sb.substring(0,sb.length()-1)); }
所以通常情況下,我們都會(huì)去擴(kuò)展一個(gè)StringBuilder以提供分隔符組裝的功能,博主平時(shí)是這樣弄的:
public class MyStringBuilder { private StringBuilder stringBuilder; private String delimiter; public MyStringBuilder(String delimiter) { this.delimiter = delimiter; } public MyStringBuilder append(String item) { getStringBuilder().append(item); return this; } /** * 模擬的就是這個(gè)邏輯: * if(index != 0){ * append(delimiter); * } * append(str); * * @return */ private StringBuilder getStringBuilder() { if (stringBuilder == null) { //相當(dāng)于index==0, stringBuilder = new StringBuilder(); } else { stringBuilder.append(delimiter); } return stringBuilder; } @Override public String toString() { return stringBuilder == null ? "" : stringBuilder.toString(); } }
在初始化的時(shí)候指定分隔符,然后每次直接append就行了,由內(nèi)部決定在何時(shí)添加分隔符。
在JDK1.8之后,提供了一個(gè)StringJoiner類,提供了類似的功能,可以在初始化的時(shí)候指定分隔符和前綴后綴:
StringJoiner sj = new StringJoiner(",","(",")"); sj.add("a").add("b").add("c"); System.out.println(sj.toString()); //輸出:(a,b,c)
博主大致看了一下StringJoiner的實(shí)現(xiàn)邏輯,很簡(jiǎn)單,和咱們擴(kuò)展StringBuilder基本是一樣的邏輯,另外加入了前綴后綴,然后多了一個(gè)merge的功能:
public StringJoiner merge(StringJoiner other) { Objects.requireNonNull(other); if (other.value != null) { final int length = other.value.length(); // lock the length so that we can seize the data to be appended // before initiate copying to avoid interference, especially when // merge 'this' StringBuilder builder = prepareBuilder(); builder.append(other.value, other.prefix.length(), length); } return this; }
到此這篇關(guān)于Java實(shí)用工具之StringJoiner詳解的文章就介紹到這了,更多相關(guān)Java StringJoiner內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java數(shù)據(jù)結(jié)構(gòu)與算法之noDups去除重復(fù)項(xiàng)算法示例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之noDups去除重復(fù)項(xiàng)算法實(shí)現(xiàn)技巧,程序代碼非常簡(jiǎn)單,關(guān)鍵在于循環(huán)與判定,需要的朋友可以參考下2016-08-08Java基礎(chǔ)之?dāng)?shù)組的初始化過程
Java數(shù)組分為靜態(tài)和動(dòng)態(tài)初始化,靜態(tài)初始化中,程序員設(shè)定元素初始值,系統(tǒng)決定長(zhǎng)度;動(dòng)態(tài)初始化中,程序員設(shè)定長(zhǎng)度,系統(tǒng)提供初始值,數(shù)組初始化后長(zhǎng)度固定,存儲(chǔ)在堆內(nèi)存中,數(shù)組變量在棧內(nèi)存指向堆內(nèi)存數(shù)組對(duì)象,基本類型數(shù)組存儲(chǔ)數(shù)據(jù)值,引用類型數(shù)組存儲(chǔ)對(duì)象引用2024-10-10Java如何利用CompletableFuture描述任務(wù)之間的關(guān)系
Java如何根據(jù)線程的執(zhí)行結(jié)果執(zhí)行下一步動(dòng)作呢,F(xiàn)uture的另一個(gè)實(shí)現(xiàn)類CompletableFuture能夠優(yōu)雅的解決異步化問題,下面就跟隨小編一起了解一下吧2023-07-07Mybatis-plus批量去重插入ON DUPLICATE key update使用方式
這篇文章主要介紹了Mybatis-plus批量去重插入ON DUPLICATE key update使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12使用mybatis-plus分頁(yè)出現(xiàn)兩個(gè)Limit的問題解決
在使用MyBatis-Plus進(jìn)行分頁(yè)查詢時(shí),可能會(huì)遇到查詢SQL中出現(xiàn)兩個(gè)limit語句的問題,這通常是由于在多個(gè)模塊中重復(fù)引入了MyBatis-Plus的分頁(yè)插件所導(dǎo)致的,下面就來介紹一下如何解決,感興趣的可以了解一下2024-10-10Java Lambda表達(dá)式和函數(shù)式接口實(shí)例分析
這篇文章主要介紹了Java Lambda表達(dá)式和函數(shù)式接口,結(jié)合實(shí)例形式分析了Java8 Lambda表達(dá)式和函數(shù)式接口相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-09-09