摘要:毋庸置疑,之前我們的第一反應(yīng)是使用刪除末尾多余的使用運(yùn)行結(jié)果時(shí),添加了一個(gè)新的用于字符串連接的類,專門用于這種需要分隔符的場(chǎng)合,它就是。
我們提出一個(gè)需求:有一個(gè) List
毋庸置疑,Java8 之前我們的第一反應(yīng)是使用 StringBuilder:
public static String formatList(Listlist, 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 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è)新的用于字符串連接的類,專門用于這種需要 分隔符 的場(chǎng)合,它就是 StringJoiner。StringJoiner 在構(gòu)造時(shí)可以指定一個(gè)分隔符(delimiter),然后每連接一個(gè)元素它便會(huì)加上一個(gè) delimiter,使用 StringJoiner 改寫 formatList:
public static String formatList(Listlist, 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 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 的代碼更加的簡(jiǎn)潔了 —— 當(dāng)然我們還可以更簡(jiǎn)潔 —— 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(Listlist, 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
查看 StringJoiner 的構(gòu)造方法,發(fā)現(xiàn) StringJoiner 除了指定 分隔符 的構(gòu)造方法,還有一個(gè)可以指定 分隔符、前綴和后綴 的構(gòu)造方法:
修改 formatList:
public static String formatList( Listlist, 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 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é)果:
很棒~ 但能不能更簡(jiǎn)潔呢? 事實(shí)上,Java8 對(duì)于字符串集合的連接操作提供了一個(gè)專門的流式 API,即 Collectors.joining 函數(shù):
無參的 joining() 方法,即不存在連接符(底層實(shí)現(xiàn)為 StringBuilder);
joining(CharSequence delimiter) 方法,即分隔符為 delimiter(底層實(shí)現(xiàn)為 StringJoiner);
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)方法,即分隔符為 delimiter,前綴為 prefix,后綴為 suffix(底層實(shí)現(xiàn)為 StringJoiner)。
那怎么使用呢? 我們直接使用三個(gè)參數(shù)的 Collectors.joining 方法改寫 formatList:
public static String formatList( Listlist, String delimiter, String prefix, String suffix) { return list.stream().collect(Collectors.joining(delimiter, prefix, suffix)); } public static void main(String[] args) throws Exception { List 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)行封裝,提供這么多易用且簡(jiǎn)介的 API,確實(shí)在很大程度上方便了編碼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66361.html
摘要:跳票之王終于發(fā)布了帶來了一系列激動(dòng)人心的新特性,包括新的時(shí)間日期,以及和,在多線程環(huán)境下性能提升不少。 跳票之王Java8終于發(fā)布了! Java8帶來了一系列激動(dòng)人心的新特性,包括lambda、新的時(shí)間日期AOPI,以及AtomicInteger和AtomicLong,在多線程環(huán)境下性能提升不少。 showImg(http://segmentfault.com/img/bVb0D2...
摘要:示例字符串?dāng)?shù)值算術(shù)和文件原文譯者飛龍協(xié)議大量的教程和文章都涉及到中最重要的改變,例如表達(dá)式和函數(shù)式數(shù)據(jù)流。不僅僅是字符串,正則表達(dá)式模式串也能受益于數(shù)據(jù)流。 Java 8 API 示例:字符串、數(shù)值、算術(shù)和文件 原文:Java 8 API by Example: Strings, Numbers, Math and Files 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 ...
摘要:在語言上并沒有添加太多的新特性,但在使用性能上做了很改進(jìn)。二多版本包支持即在不同版本下,執(zhí)行相應(yīng)版本的代碼。在發(fā)布新版本的后,用戶可能不會(huì)升級(jí)到新環(huán)境,但是項(xiàng)目可能會(huì)開始逐步升級(jí)到新版本,來提前適應(yīng)即將到來的環(huán)境。 Java9在語言上并沒有添加太多的新特性,但在使用、性能上做了很改進(jìn)。 一、模塊間引用 Java9添加了模塊化的概念,使得之前的控制訪問權(quán)限有了改變。 之前: publ...
摘要:上一篇小樂給大家說了樂字節(jié)新特性之,接下來小樂繼續(xù)給大家說一說新特性之和重復(fù)注解與類型注解。內(nèi)部類與方法相關(guān)的內(nèi)部類這是一個(gè)靜態(tài)類。也是一個(gè)靜態(tài)類。 上一篇小樂給大家說了《樂字節(jié)-Java8新特性之Date API》,接下來小樂繼續(xù)給大家說一說Java8新特性之Base64和重復(fù)注解與類型注解。 一、Base64 在Java 8中,內(nèi)置了Base64編解碼相關(guān)的特性。Java 8中使用...
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達(dá)式改進(jìn)后或者是不得不承認(rèn),代碼看起來跟清晰了。這是由泛型接口內(nèi)部實(shí)現(xiàn)方式造成的。 # Lambda表達(dá)式在《Java8實(shí)戰(zhàn)》中第三章主要講的是Lambda表達(dá)式,在上一章節(jié)的筆記中我們利用了行為參數(shù)化來因?qū)Σ粩嘧兓男枨?,最后我們也使用到了Lambda,通過表達(dá)式為我們簡(jiǎn)化了很多代碼從而極大地提高了我們的...
閱讀 1836·2021-09-28 09:46
閱讀 3154·2019-08-30 14:22
閱讀 1886·2019-08-26 13:36
閱讀 3352·2019-08-26 11:32
閱讀 2101·2019-08-23 16:56
閱讀 1158·2019-08-23 16:09
閱讀 1311·2019-08-23 12:55
閱讀 2158·2019-08-23 11:44