成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 8中字符串拼接新姿勢:StringJoiner

開發 開發工具
我們介紹了幾種Java中字符串拼接的方式,以及優缺點。其中還有一個重要的拼接方式我沒有介紹,那就是Java 8中提供的StringJoiner ,本文就來介紹一下這個字符串拼接的新兵。

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

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

 

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

1.介紹

StringJoiner是java.util包中的一個類,用于構造一個由分隔符分隔的字符序列(可選),并且可以從提供的前綴開始并以提供的后綴結尾。

雖然這也可以在StringBuilder類的幫助下在每個字符串之后附加分隔符,但StringJoiner提供了簡單的方法來實現,而無需編寫大量代碼。

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

2.用法

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

  1. public class StringJoinerTest { 
  2.  
  3.     public static void main(String[] args) { 
  4.         StringJoiner sj = new StringJoiner("Hollis"); 
  5.  
  6.         sj.add("hollischuang"); 
  7.         sj.add("Java干貨"); 
  8.         System.out.println(sj.toString()); 
  9.  
  10.         StringJoiner sj1 = new StringJoiner(":","[","]"); 
  11.  
  12.         sj1.add("Hollis").add("hollischuang").add("Java干貨"); 
  13.         System.out.println(sj1.toString()); 
  14.     } 

以上代碼輸出結果:

  1. hollischuangHollisJava干貨 
  2. [Hollis:hollischuang:Java干貨] 

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

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

3.原理

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

  1. public StringJoiner add(CharSequence newElement) { 
  2.     prepareBuilder().append(newElement); 
  3.     return this; 
  4.  
  5. private StringBuilder prepareBuilder() { 
  6.     if (value != null) { 
  7.         value.append(delimiter); 
  8.     } else { 
  9.         value = new StringBuilder().append(prefix); 
  10.     } 
  11.     return value; 

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

當我們發現StringJoiner其實是通過StringBuilder實現之后,我們大概就可以猜到,StringJoiner性能損耗應該和直接使用StringBuilder差不多!

為什么需要StringJoiner

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

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

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

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

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

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

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

  1. Hollis,hollischuang,Java干貨 

可以通過以下方式:

  1. StringBuilder builder = new StringBuilder(); 
  2.  
  3. if (!list.isEmpty()) { 
  4.     builder.append(list.get(0)); 
  5.     for (int i = 1, n = list.size(); i < n; i++) { 
  6.         builder.append(",").append(list.get(i)); 
  7.     } 
  8. builder.toString(); 

還可以使用:

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

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

  1. Hollis,hollischuang,Java干貨, 

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

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

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

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

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

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

  1. public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix) { 
  2.     return new CollectorImpl<>( 
  3.             () -> new StringJoiner(delimiter, prefix, suffix), 
  4.             StringJoiner::add, StringJoiner::merge, 
  5.             StringJoiner::toString, CH_NOID); 

Collector.joining的實現原理就是借助了StringJoiner。

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

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

4.總結

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

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

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

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

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

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

4、如果是對一組數據進行拼接,則可以考慮將其轉換成Stream,并使用StringJoiner處理。

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-04-21 10:36:47

StringBuildJava8StringJoine

2022-04-19 15:16:15

Python開發技巧

2016-12-27 09:46:55

Java 8StringBuild

2017-01-19 11:26:55

Java 8StringBuild

2011-07-11 16:00:22

字符串拼接

2022-11-25 07:53:26

bash腳本字符串

2013-06-24 15:16:29

Java字符串拼接

2021-06-11 18:08:00

Java字符串拼接

2021-05-31 07:57:00

拼接字符串Java

2025-01-03 08:31:43

2023-10-31 18:57:02

Java字符串

2024-10-28 07:10:00

scroll標記前端網格布局

2025-02-17 11:41:14

2016-10-12 10:18:53

Java字符串源碼分析

2019-12-25 15:41:50

JavaScript程序員編程語言

2021-10-31 23:01:50

語言拼接字符串

2024-04-30 11:49:16

瀏覽器前端開發折疊屏應用

2011-07-11 15:36:44

JavaScript

2021-05-26 08:21:43

@Autowired項目@Resouce

2025-02-19 12:00:00

SpringBootDeepSeekAI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频中文字幕 | 国产成人综合网 | 久久综合久久久 | 亚洲97 | 国产一区二区欧美 | 成人亚洲片 | 国产精品久久久久久久久久免费看 | av性色| 九九综合 | 国产东北一级毛片 | 一级a性色生活片久久毛片波多野 | 精精国产xxxx视频在线播放 | 久久精品日 | 日本午夜免费福利视频 | 国产精品一区二区三区99 | av官网在线 | 国产有码 | 久久久久久久久久久久久9999 | 性国产丰满麻豆videosex | 国产精品久久久久久久午夜 | 阿v视频在线观看 | 国产精品久久久久久婷婷天堂 | 亚洲第一av | 国产精品美女久久久久aⅴ国产馆 | 男女免费观看在线爽爽爽视频 | 国产精品高潮呻吟久久久久 | 国产小视频在线 | 国产伦精品一区二区三区精品视频 | 视频三区 | 国产网站在线免费观看 | 青久草视频 | 亚洲成人精品在线 | 欧美日韩视频 | av三级在线观看 | av一区二区三区 | 综合一区二区三区 | 日韩1区| 精品欧美一区二区三区久久久 | 中文字幕一区二区三区四区五区 | 日本人麻豆 | 国产免费拔擦拔擦8x高清 |