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