Java8:對字符串鏈接的改進

Java8:對字符串鏈接的改進
咱們提出一個需求:有一個 List<String>,將其格式化爲 元素1, 元素2, 元素3, ... 元素N 的字符串形式。

毋庸置疑,Java8 以前咱們的第一反應是使用 StringBuildergit

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);
}
複製代碼

運行結果: github

使用 StringBuilder

JDK1.8 時,添加了一個新的用於字符串鏈接的類,專門用於這種須要 分隔符 的場合,它就是 StringJoinerStringJoiner 在構造時能夠指定一個分隔符(delimiter),而後每鏈接一個元素它便會加上一個 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);
}

複製代碼

運行結果: 算法

使用 StringJoiner

formatList 的代碼更加的簡潔了 —— 固然咱們還能夠更簡潔 —— JDK1.8 爲 String 類添加了一個新的靜態方法,String.join編程

String的 join 方法

能夠看到,第一個參數爲一個分隔符 delimiter,第二個參數能夠是一個 Iterable,或者是一個變長參數的 CharSequenceString 就是 CharSequence 的子類)。 因此 formatList 方法只須要一句代碼就搞定:bash

public static String formatList(List<String> list, String delimiter) {
    return String.join(delimiter, list);
}
複製代碼

固然,咱們能猜到,String.join 方法的功能內部是經過 StringJoiner 來實現的,String.join (CharSequence, Iterable) 的源碼: 微信

String.join 的源碼

可是咱們看到了 String.join 方法的不足 —— 它不能指定前綴和後綴 —— 好比咱們若是想要直接將 List<String> 格式化爲 { 元素1, 元素2, 元素3, ... 元素N } 呢?(此時前綴爲 "{ ",後綴爲 " }"數據結構

查看 StringJoiner 的構造方法,發現 StringJoiner 除了指定 分隔符 的構造方法,還有一個能夠指定 分隔符、前綴和後綴 的構造方法: app

StringJoiner 的構造方法

修改 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);
}
複製代碼

運行結果:

StringJoiner,帶前綴和後綴
很棒~ 但能不能更簡潔呢? 事實上, Java8 對於字符串集合的鏈接操做提供了一個專門的流式 API,即 Collectors.joining 函數:!
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(
        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);
}
複製代碼

運行結果:

使用 Collectors.joining

查看 StringJoiner 的源碼,咱們能夠知道 StringJoiner 的底層實現就是 StringBuilder —— Java8 將 使用分隔符鏈接多個字符串 這一功能進行封裝,提供這麼多易用且簡介的 API,確實在很大程度上方便了編碼。

推薦

大廠筆試內容集合(內有詳細解析) 持續更新中....

ProcessOn是一個在線做圖工具的聚合平臺~

文末

歡迎關注Coder編程公衆號,主要分享數據結構與算法、Java相關知識體系、框架知識及原理、Spring全家桶、微服務項目實戰、DevOps實踐之路、每日一篇互聯網大廠面試或筆試題以及PMP項目管理知識等。更多精彩內容正在路上~ 新建了一個qq羣:315211365,歡迎你們進羣交流一塊兒學習。謝謝了!也能夠介紹給身邊有須要的朋友。

文章收錄至 Github: github.com/CoderMerlin… Gitee: gitee.com/573059382/c… 歡迎關注並star~

微信公衆號
相關文章
相關標籤/搜索