91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Java8中字符串拼接新姿勢(shì):StringJoiner

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

浙江網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

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

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

1.介紹

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

雖然這也可以在StringBuilder類(lèi)的幫助下在每個(gè)字符串之后附加分隔符,但StringJoiner提供了簡(jiǎn)單的方法來(lái)實(shí)現(xiàn),而無(wú)需編寫(xiě)大量代碼。

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

2.用法

StringJoiner的用法比較簡(jiǎn)單,下面的代碼中,我們使用StringJoiner進(jìn)行了字符串拼接。

 
 
 
 
  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.     } 

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

 
 
 
 
  1. hollischuangHollisJava干貨 
  2. [Hollis:hollischuang:Java干貨](méi) 

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

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

3.原理

介紹了簡(jiǎn)單的用法之后,我們?cè)賮?lái)看看這個(gè)StringJoiner的原理,看看他到底是如何實(shí)現(xiàn)的。主要看一下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; 

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

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

為什么需要StringJoiner

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

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

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

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

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

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

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

 
 
 
 
  1. Hollis,hollischuang,Java干貨 

可以通過(guò)以下方式:

 
 
 
 
  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(); 

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

 
 
 
 
  1. Hollis,hollischuang,Java干貨, 

還可以使用"+"進(jìn)行拼接:

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

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

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

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

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

 
 
 
 
  1. public static Collector 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的實(shí)現(xiàn)原理就是借助了StringJoiner。

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

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

4.總結(jié)

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

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

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

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

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

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

4、如果是對(duì)一組數(shù)據(jù)進(jìn)行拼接,則可以考慮將其轉(zhuǎn)換成Stream,并使用StringJoiner處理。

【本文是專(zhuān)欄作者Hollis的原創(chuàng)文章,作者微信公眾號(hào)Hollis(ID:hollischuang)】


標(biāo)題名稱(chēng):Java8中字符串拼接新姿勢(shì):StringJoiner
網(wǎng)站路徑:http://m.jiaoqi3.com/article/dppoise.html