老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)

Java8中字符串拼接新姿勢StringJoiner詳解

在為什么阿里巴巴不建議在for循環(huán)中使用”+”進行字符串拼接一文中,我們介紹了幾種Java中字符串拼接的方式,以及優(yōu)缺點。其中還有一個重要的拼接方式我沒有介紹,那就是Java 8中提供的StringJoiner ,本文就來介紹一下這個字符串拼接的新兵。

創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元龍川做網(wǎng)站,已為上家服務(wù),為龍川各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220

如果你想知道一共有多少種方法可以進行字符串拼接,教你一個簡單的辦法,在Intellij IDEA中,定義一個Java Bean,然后嘗試使用快捷鍵自動生成一個toString方法,IDEA會提示多種toString生成策略可供選擇。

11111

目前我使用的IDEA的toString生成策略默認的是使用JDK 1.8提供的StringJoiner。

介紹

StringJoiner是java.util包中的一個類,用于構(gòu)造一個由分隔符分隔的字符序列(可選),并且可以從提供的前綴開始并以提供的后綴結(jié)尾。雖然這也可以在StringBuilder類的幫助下在每個字符串之后附加分隔符,但StringJoiner提供了簡單的方法來實現(xiàn),而無需編寫大量代碼。

StringJoiner類共有2個構(gòu)造函數(shù),5個公有方法。其中最常用的方法就是add方法和toString方法,類似于StringBuilder中的append方法和toString方法。

用法

StringJoiner的用法比較簡單,下面的代碼中,我們使用StringJoiner進行了字符串拼接。

public class StringJoinerTest {

  public static void main(String[] args) {
    StringJoiner sj = new StringJoiner("Hollis");

    sj.add("hollischuang");
    sj.add("Java干貨");
    System.out.println(sj.toString());

    StringJoiner sj1 = new StringJoiner(":","[","]");

    sj1.add("Hollis").add("hollischuang").add("Java干貨");
    System.out.println(sj1.toString());
  }
}

以上代碼輸出結(jié)果:

hollischuangHollisJava干貨
[Hollis:hollischuang:Java干貨]

值得注意的是,當我們StringJoiner(CharSequence delimiter)初始化一個StringJoiner的時候,這個delimiter其實是分隔符,并不是可變字符串的初始值。

StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)的第二個和第三個參數(shù)分別是拼接后的字符串的前綴和后綴。

原理

介紹了簡單的用法之后,我們再來看看這個StringJoiner的原理,看看他到底是如何實現(xiàn)的。主要看一下add方法:

public StringJoiner add(CharSequence newElement) {
  prepareBuilder().append(newElement);
  return this;
}

private StringBuilder prepareBuilder() {
  if (value != null) {
    value.append(delimiter);
  } else {
    value = new StringBuilder().append(prefix);
  }
  return value;
}

看到了一個熟悉的身影——StringBuilder ,沒錯,StringJoiner其實就是依賴StringBuilder實現(xiàn)的,在為什么阿里巴巴不建議在for循環(huán)中使用”+”進行字符串拼接中我們介紹過StringBuilder的實現(xiàn)原理,本文不在贅述。

當我們發(fā)現(xiàn)StringJoiner其實是通過StringBuilder實現(xiàn)之后,我們大概就可以猜到,他的性能損耗應(yīng)該和直接使用StringBuilder差不多!

為什么需要StringJoiner

在了解了StringJoiner的用法和原理后,可能很多讀者就會產(chǎn)生一個疑問,明明已經(jīng)有一個StringBuilder了,為什么Java 8中還要定義一個StringJoiner呢?到底有什么好處呢?

如果讀者足夠了解Java 8的話,或許可以猜出個大概,這肯定和Stream有關(guān)。

作者也在Java doc中找到了答案:

A StringJoiner may be employed to create formatted output from a Stream using Collectors.joining(CharSequence)

試想,在Java中,如果我們有這樣一個List:

List list = ImmutableList.of("Hollis","hollischuang","Java干貨");

如果我們想要把他拼接成一個以下形式的字符串:

Hollis,hollischuang,Java干貨

可以通過以下方式:

StringBuilder builder = new StringBuilder();

if (!list.isEmpty()) {
  builder.append(list.get(0));
  for (int i = 1, n = list.size(); i < n; i++) {
    builder.append(",").append(list.get(i));
  }
}
builder.toString();

還可以使用:

list.stream().reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString();

但是輸出結(jié)果稍有些不同,需要進行二次處理:

Hollis,hollischuang,Java干貨,

還可以使用”+”進行拼接:

list.stream().reduce((a,b)->a + "," + b).toString();

以上幾種方式,要么是代碼復(fù)雜,要么是性能不高,或者無法直接得到想要的結(jié)果。

為了滿足類似這樣的需求,Java 8中提供的StringJoiner就派上用場了。以上需求只需要一行代碼:

list.stream().collect(Collectors.joining(":"))

即可。上面用的表達式中,Collectors.joining的源代碼如下:

public static Collector joining(CharSequence delimiter,
                             CharSequence prefix,
                             CharSequence suffix) {
  return new CollectorImpl<>(
      () -> new StringJoiner(delimiter, prefix, suffix),
      StringJoiner::add, StringJoiner::merge,
      StringJoiner::toString, CH_NOID);
}

其實現(xiàn)原理就是借助了StringJoiner。

當然,或許在Collector中直接使用StringBuilder似乎也可以實現(xiàn)類似的功能,只不過稍微麻煩一些。所以,Java 8中提供了StringJoiner來豐富Stream的用法。

而且StringJoiner也可以方便的增加前綴和后綴,比如我們希望得到的字符串是[Hollis,hollischuang,Java干貨]而不是Hollis,hollischuang,Java干貨的話,StringJoiner的優(yōu)勢就更加明顯了。

總結(jié)

本文介紹了Java 8中提供的可變字符串類——StringJoiner,可以用于字符串拼接。

StringJoiner其實是通過StringBuilder實現(xiàn)的,所以他的性能和StringBuilder差不多,他也是非線程安全的。

如果日常開發(fā)中中,需要進行字符串拼接,如何選擇?

1、如果只是簡單的字符串拼接,考慮直接使用”+”即可。

2、如果是在for循環(huán)中進行字符串拼接,考慮使用StringBuilder和StringBuffer。

3、如果是通過一個List進行字符串拼接,則考慮使用StringJoiner。

以上就是本次介紹的全部知識點內(nèi)容,感謝大家對創(chuàng)新互聯(lián)的支持。


文章題目:Java8中字符串拼接新姿勢StringJoiner詳解
標題URL:http://www.xueling.net.cn/article/ipjojh.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲欧美日韩国产综合 | 中文人妻av久久人妻水蜜桃 | 亚洲AV成人无码一区在线观看 | 欧美精品一区二区三区在线四季 | 91九色夫妻 | 少女哔哩哔哩视频在线看 | 538国产精品一区二区免费视频 | 亚洲欧美人成视频一区在线 | 猫咪成人在线观看 | av在线图片 | 国产99久久九九精品无码 | 美女高潮网站 | 成人一级毛片视频 | 天天躁日日躁狠狠躁婷婷 | 桃花视频大全不卡免费观看网站 | 一级黄色香蕉视频 | av在线播放观看 | 午夜二区| 在线不卡欧美精品一区二区三区 | 久久免费视频播放 | 她似遥上月短剧免费观看 | 国产粉嫩高中无套进入 | 国产精品| 国产一二三四2021精字窝 | 国产美女裸体无遮挡免费视频 | 国产综合视频在线 | 黄色片观看 | 免费A级毛片中文字幕 | 日韩午夜伦伦午夜伦老司机 | 伊人青草| 69久久夜色精品国产69 | 三级国产三级在线 | 欧美日韩一区成人 | 成人A片产无码免费奶头 | 国产精品久久久久久久久夜色 | 成人毛片18女人 | 呦一呦二在线精品视频 | 国产精品视频二区三区 | 亚洲精品国产有码 | 91少妇丨porny丨 | 超频97人妻在线视频 |