偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

字符串拼接還在用StringBuilder?快試試Java8中的StringJoiner吧,真香!

開(kāi)發(fā) 后端
我們經(jīng)常會(huì)通過(guò)StringBuffer或者StingBuilder對(duì)字符串進(jìn)行拼接,但是你知道Java8中推出的StringJoiner嗎?它比前者更加優(yōu)美、靈活,如果你現(xiàn)在還使用StringBuffer拼接,強(qiáng)烈推薦你試試StringJoiner。

[[394661]]

 前言

之前,我們經(jīng)常會(huì)通過(guò)StringBuffer或者StingBuilder對(duì)字符串進(jìn)行拼接,但是你知道Java8中推出的StringJoiner嗎?它比前者更加優(yōu)美、靈活,如果你現(xiàn)在還使用StringBuffer拼接,強(qiáng)烈推薦你試試StringJoiner。

介紹

在實(shí)用StringJoiner類(lèi)之前,如果我們想要數(shù)據(jù)最終的字符串以逗號(hào)隔開(kāi),大概是這樣的 

  1. StringBuilder sb = new StringBuilder();  
  2. IntStream.range(1,10).forEach(i-> 
  3.     sb.append(i+"");  
  4.     if( i < 10){  
  5.         sb.append(",")  
  6.     }   
  7. }); 

如果引入StringJoiner,如何處理呢? 

  1. StringJoiner sj = new StringJoiner(",");  
  2. IntStream.range(1,10).forEach(i->sj.add(i+"")); 

看著是不是更簡(jiǎn)單直觀了呢?

另外,StringJoiner類(lèi)的構(gòu)造函數(shù),還可以做到可選擇性地從我們自定義的前綴開(kāi)始和自定義的后綴結(jié)尾,比較靈活和實(shí)用。 

  1. //值依次是分割符 , 前綴  ,后綴  
  2. StringJoiner stringJoiner = new StringJoiner(",", "[", "]");  
  3.         stringJoiner.add("xiao");  
  4.         stringJoiner.add("zhi");  
  5.         System.out.println(stringJoiner.toString());   

輸出結(jié)果:[xiao,zhi]

StringJoiner在處理sql拼接上面,也非常方便,如拼接 sql 的in條件的時(shí)候: 

  1. StringJoiner joiner3 = new StringJoiner("','", "'", "'");  
  2. joiner3.add("1").add("2");  
  3. //輸出 : '1','2' 

更多實(shí)用的功能,大家可以探索。

源碼

這個(gè)類(lèi)的源碼很簡(jiǎn)單,大家很容易就可以看明白。StringJoiner 更像一個(gè)裝飾者模式,對(duì)外隱藏了StringBuilder。

不過(guò)需要注意的是 StringJoiner 并且沒(méi)有處理一些基本的集合元素情況,比如加入列表的元素,更像針對(duì)Collectors而設(shè)計(jì)。 

  1. package java.util;  
  2. public final class StringJoiner {  
  3.     private final String prefix;//前綴  
  4.     private final String delimiter;//間隔符  
  5.     private final String suffix;//后綴  
  6.     private StringBuilder value;//值  
  7.     private String emptyValue;//空值  
  8.     public StringJoiner(CharSequence delimiter) {  
  9.         this(delimiter, "", "");  
  10.         //默認(rèn)前綴和后綴為"",重載調(diào)用  
  11.     }  
  12.     public StringJoiner(CharSequence delimiter,  
  13.                         CharSequence prefix,  
  14.                         CharSequence suffix) {  
  15.         //間隔符,前綴和后綴判斷是否為null,null將拋出異常  
  16.         Objects.requireNonNull(prefix, "The prefix must not be null");  
  17.         Objects.requireNonNull(delimiter, "The delimiter must not be null"); 
  18.         Objects.requireNonNull(suffix, "The suffix must not be null");   
  19.         // 成員變量賦值  
  20.         this.prefix = prefix.toString();  
  21.         this.delimiter = delimiter.toString();  
  22.         this.suffix = suffix.toString();  
  23.         thisthis.emptyValue = this.prefix + this.suffix;//空值被設(shè)置為只有前后綴  
  24.     }  
  25.  //設(shè)置空值,檢查是否為null  
  26.     public StringJoiner setEmptyValue(CharSequence emptyValue) {  
  27.         this.emptyValue = Objects.requireNonNull(emptyValue,  
  28.             "The empty value must not be null").toString();  
  29.         return this;  
  30.     }  
  31.     @Override  
  32.     public String toString() {  
  33.         if (value == null) {  
  34.             return emptyValue;  
  35.             //沒(méi)有值將返回空值或者后續(xù)設(shè)置的空值  
  36.         } else {  
  37.             if (suffix.equals("")) {  
  38.                 return value.toString();  
  39.                 //后綴為""直接返回字符串,不用添加  
  40.             } else {  
  41.              //后綴不為"",添加后綴,然后直接返回字符串,修改長(zhǎng)度  
  42.                 int initialLength = value.length();  
  43.                 String result = value.append(suffix).toString();  
  44.                 // reset value to pre-append initialLength  
  45.                 value.setLength(initialLength);  
  46.                 return result;  
  47.             }  
  48.         }  
  49.     }  
  50.     //初始化,先添加前綴,有了之后每次先添加間隔符,StringBuilder后續(xù)append字符串  
  51.     public StringJoiner add(CharSequence newElement) {  
  52.         prepareBuilder().append(newElement);  
  53.         return this;  
  54.     }  
  55.  //合并StringJoiner,注意后面StringJoiner 的前綴就不要了,后面的appen進(jìn)來(lái)  
  56.     public StringJoiner merge(StringJoiner other) {  
  57.         Objects.requireNonNull(other);  
  58.         if (other.value != null) {  
  59.             final int length = other.value.length();  
  60.             // lock the length so that we can seize the data to be appended  
  61.             // before initiate copying to avoid interference, especially when  
  62.             // merge 'this'  
  63.             StringBuilder builder = prepareBuilder();  
  64.             builder.append(other.value, other.prefix.length(), length);  
  65.         }  
  66.         return this;  
  67.     }  
  68.  //初始化,先添加前綴,添加之后每次先添加間隔符  
  69.     private StringBuilder prepareBuilder() {  
  70.         if (value != null) {  
  71.             value.append(delimiter);  
  72.         } else {  
  73.             value = new StringBuilder().append(prefix);  
  74.         } 
  75.         return value;  
  76.     }  
  77.     public int length() {  
  78.         // Remember that we never actually append the suffix unless we return 
  79.         // the full (present) value or some sub-string or length of it, so that  
  80.         // we can add on more if we need to. 
  81.         //添加后綴的長(zhǎng)度  
  82.         return (value != null ? value.length() + suffix.length() :  
  83.                 emptyValue.length());  
  84.     }  
  85.  

 

責(zé)任編輯:龐桂玉 來(lái)源: Java編程
相關(guān)推薦

2019-02-27 09:08:20

Java 8StringJoineIDEA

2021-08-13 12:53:42

StringBuildStringJoineJava

2016-12-27 09:46:55

Java 8StringBuild

2017-01-19 11:26:55

Java 8StringBuild

2010-06-24 09:38:42

Windows備份云平臺(tái)

2025-02-27 08:18:40

2024-01-23 13:20:00

分庫(kù)分表分布式

2019-09-21 21:32:34

數(shù)據(jù)庫(kù)SQL分布式

2020-11-19 07:51:06

StringJoine分隔符使用

2011-07-11 16:00:22

字符串拼接

2013-06-24 15:16:29

Java字符串拼接

2024-03-11 08:21:49

2024-03-18 00:00:00

CalendaJava8Date

2022-11-25 07:53:26

bash腳本字符串

2023-02-01 10:40:01

2021-12-06 17:44:56

MHAMySQL高可用

2024-10-28 10:55:50

Jedis組件客戶端

2023-02-27 08:53:54

JedislettuceRedis

2021-06-11 18:08:00

Java字符串拼接

2024-03-21 08:55:41

享元模式對(duì)象內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)