成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java8(2):Java8 對(duì)字符串連接的改進(jìn)

airborne007 / 611人閱讀

摘要:毋庸置疑,之前我們的第一反應(yīng)是使用刪除末尾多余的使用運(yùn)行結(jié)果時(shí),添加了一個(gè)新的用于字符串連接的類,專門用于這種需要分隔符的場(chǎng)合,它就是。

我們提出一個(gè)需求:有一個(gè) List,將其格式化為 元素1, 元素2, 元素3, ... 元素N 的字符串形式

毋庸置疑,Java8 之前我們的第一反應(yīng)是使用 StringBuilder

public static String formatList(List 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 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(List 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 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ù)的 CharSequenceString 就是 CharSequence 的子類)。
所以 formatList 方法只需要一句代碼就搞定:

public static String formatList(List 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 格式化為 { 元素1, 元素2, 元素3, ... 元素N } 呢?(此時(shí)前綴為 "{ ",后綴為 " }"

查看 StringJoiner 的構(gòu)造方法,發(fā)現(xiàn) StringJoiner 除了指定 分隔符 的構(gòu)造方法,還有一個(gè)可以指定 分隔符、前綴和后綴 的構(gòu)造方法:

修改 formatList

public static String formatList(
        List 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 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(
        List 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 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

相關(guān)文章

  • 千呼萬喚始出來 Java8發(fā)布

    摘要:跳票之王終于發(fā)布了帶來了一系列激動(dòng)人心的新特性,包括新的時(shí)間日期,以及和,在多線程環(huán)境下性能提升不少。 跳票之王Java8終于發(fā)布了! Java8帶來了一系列激動(dòng)人心的新特性,包括lambda、新的時(shí)間日期AOPI,以及AtomicInteger和AtomicLong,在多線程環(huán)境下性能提升不少。 showImg(http://segmentfault.com/img/bVb0D2...

    lx1036 評(píng)論0 收藏0
  • Java 8 API 示例:符串、數(shù)值、算術(shù)和文件

    摘要:示例字符串?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 ...

    KavenFan 評(píng)論0 收藏0
  • Java 9 新特性

    摘要:在語言上并沒有添加太多的新特性,但在使用性能上做了很改進(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...

    SegmentFault 評(píng)論0 收藏0
  • 樂字節(jié)-Java8新特性之Base64和重復(fù)注解與類型注解

    摘要:上一篇小樂給大家說了樂字節(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中使用...

    1treeS 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第三章讀書筆記(Lambda表達(dá)式-01)

    摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達(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)化了很多代碼從而極大地提高了我們的...

    longshengwang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<