淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢
我們提出一個(gè)需求:有一個(gè) List<String>
,將其格式化為 元素1, 元素2, 元素3, ... 元素N 的字符串形式。
毋庸置疑, Java8
之前我們的第一反應(yīng)是使用 StringBuilder
:
public static String formatList(List<String> list, String delimiter) { StringBuilder result = new StringBuilder(); for (String str : list) { result.append(str).append(delimiter); } // 刪除末尾多余的 delimiter result.delete(result.length() - delimiter.length(), result.length()); return result.toString(); } public static void main(String[] args) throws Exception { List<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g"); System.out.println("使用 StringBuilder:"); String format = formatList(list, ", "); System.out.println(format); }
運(yùn)行結(jié)果:
JDK1.8 時(shí),添加了一個(gè)新的用于字符串連接的類,專門用于這種需要 分隔符 的場合,它就是 StringJoiner
。 StringJoiner
在構(gòu)造時(shí)可以指定一個(gè)分隔符(delimiter),然后每連接一個(gè)元素它便會(huì)加上一個(gè) delimiter
,使用 StringJoiner
改寫 formatList
:
public static String formatList(List<String> list, String delimiter) { StringJoiner result = new StringJoiner(delimiter); for (String str : list) { result.add(str); } return result.toString(); } public static void main(String[] args) throws Exception { List<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g"); System.out.println("使用 StringJoiner:"); String format = formatList(list, ", "); System.out.println(format); }
運(yùn)行結(jié)果:
formatList
的代碼更加的簡潔了 —— 當(dāng)然我們還可以更簡潔 —— JDK1.8 為 String
類添加了一個(gè)新的靜態(tài)方法, String.join
:
可以看到,第一個(gè)參數(shù)為一個(gè)分隔符 delimiter
,第二個(gè)參數(shù)可以是一個(gè) Iterable
,或者是一個(gè)變長參數(shù)的 CharSequence
( String
就是 CharSequence
的子類)。 所以 formatList
方法只需要一句代碼就搞定:
public static String formatList(List<String> list, String delimiter) { return String.join(delimiter, list); }
當(dāng)然,我們能猜到, String.join
方法的功能內(nèi)部是通過 StringJoiner
來實(shí)現(xiàn)的, String.join (CharSequence, Iterable)
的源碼:
但是我們看到了 String.join
方法的不足 —— 它不能指定前綴和后綴 —— 比如我們?nèi)绻胍苯訉?List<String>
格式化為 { 元素1, 元素2, 元素3, ... 元素N } 呢?(此時(shí)前綴為 "{ "
,后綴為 " }"
)
查看 StringJoiner
的構(gòu)造方法,發(fā)現(xiàn) StringJoiner
除了指定 分隔符 的構(gòu)造方法,還有一個(gè)可以指定 分隔符、前綴和后綴 的構(gòu)造方法:
修改 formatList
:
public static String formatList( List<String> list, String delimiter, String prefix, String suffix) { StringJoiner result = new StringJoiner(delimiter, prefix, suffix); for (String str : list) { result.add(str); } return result.toString(); } public static void main(String[] args) throws Exception { List<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g"); System.out.println("使用 StringJoiner,帶前綴和后綴:"); String format = formatList(list, ", ", "{ ", " }"); System.out.println(format); }
運(yùn)行結(jié)果:
很棒~ 但能不能更簡潔呢? 事實(shí)上, Java8
對(duì)于字符串集合的連接操作提供了一個(gè)專門的流式 API,即 Collectors.joining
函數(shù):!
無參的 joining() 方法,即不存在連接符(底層實(shí)現(xiàn)為 StringBuilder);
joining(CharSequence delimiter) 方法,即分隔符為 delimiter(底層實(shí)現(xiàn)為 StringJoiner);j
oining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)方法,即分隔符為 delimiter,前綴為 prefix,后綴為 suffix(底層實(shí)現(xiàn)為 StringJoiner)。
那怎么使用呢? 我們直接使用三個(gè)參數(shù)的 Collectors.joining 方法改寫 formatList:
public static String formatList( List<String> list, String delimiter, String prefix, String suffix) { return list.stream().collect(Collectors.joining(delimiter, prefix, suffix)); } public static void main(String[] args) throws Exception { List<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g"); System.out.println("使用 Collectors.joining:"); String format = formatList(list, ", ", "{ ", " }"); System.out.println(format); }
運(yùn)行結(jié)果:
查看 StringJoiner 的源碼,我們可以知道 StringJoiner 的底層實(shí)現(xiàn)就是 StringBuilder —— Java8 將 使用分隔符連接多個(gè)字符串 這一功能進(jìn)行封裝,提供這么多易用且簡介的 API,確實(shí)在很大程度上方便了編碼。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一文讀懂a(chǎn)va中的Volatile關(guān)鍵字使用
volatile關(guān)鍵字的作用保證了變量的可見性(visibility)。被volatile關(guān)鍵字修飾的變量,如果值發(fā)生了變更,其他線程立馬可見,避免出現(xiàn)臟讀的現(xiàn)象。這篇文章主要介紹了ava中的Volatile關(guān)鍵字使用,需要的朋友可以參考下2020-03-03java實(shí)現(xiàn)字符串匹配求兩個(gè)字符串的最大公共子串
這篇文章主要介紹了java實(shí)現(xiàn)求兩個(gè)字符串最大公共子串的方法,詳細(xì)的描述了兩個(gè)字符串的最大公共子串算法的實(shí)現(xiàn),需要的朋友可以參考下2016-10-10Java超詳細(xì)分析講解final關(guān)鍵字的用法
關(guān)于final關(guān)鍵字,它也是我們一個(gè)經(jīng)常用的關(guān)鍵字,可以修飾在類上、或者修飾在變量、方法上,以此看來定義它的一些不可變性!像我們經(jīng)常使用的String類中,它便是final來修飾的類,并且它的字符數(shù)組也是被final所修飾的。但是一些final的一些細(xì)節(jié)你真的了解過嗎2022-06-06舉例講解Java的Hibernate框架中的多對(duì)一和一對(duì)多映射
這篇文章主要介紹了Java的Hibernate框架中的多對(duì)一和一對(duì)多映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12java字符串遍歷以及統(tǒng)計(jì)字符串中各類字符
這篇文章主要為大家詳細(xì)介紹了java字符串遍歷以及字符串中各類字符統(tǒng)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03springboot下添加日志模塊和設(shè)置日志文件輸出的方法
日志的使用將通過SLF4J來使用,SLF4J是一個(gè)為Java應(yīng)用提供簡單日志記錄的接口,在Spring框架中,SLF4J常常用于處理框架本身以及應(yīng)用程序的日志記錄,本文給大家介紹springboot下添加日志模塊和設(shè)置日志文件輸出的相關(guān)知識(shí),感興趣的朋友一起看看吧2023-12-12