自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[394661]]

 前言

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

介紹

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

  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+"")); 

看著是不是更簡單直觀了呢?

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

  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條件的時候: 

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

更多實用的功能,大家可以探索。

源碼

這個類的源碼很簡單,大家很容易就可以看明白。StringJoiner 更像一個裝飾者模式,對外隱藏了StringBuilder。

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

  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.         //默認前綴和后綴為"",重載調(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.             //沒有值將返回空值或者后續(xù)設(shè)置的空值  
  36.         } else {  
  37.             if (suffix.equals("")) {  
  38.                 return value.toString();  
  39.                 //后綴為""直接返回字符串,不用添加  
  40.             } else {  
  41.              //后綴不為"",添加后綴,然后直接返回字符串,修改長度  
  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進來  
  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.         //添加后綴的長度  
  82.         return (value != null ? value.length() + suffix.length() :  
  83.                 emptyValue.length());  
  84.     }  
  85.  

 

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

2019-02-27 09:08:20

Java 8StringJoineIDEA

2021-08-13 12:53:42

StringBuildStringJoineJava

2017-01-19 11:26:55

Java 8StringBuild

2016-12-27 09:46:55

Java 8StringBuild

2010-06-24 09:38:42

Windows備份云平臺

2025-02-27 08:18:40

2024-01-23 13:20:00

分庫分表分布式

2011-07-11 16:00:22

字符串拼接

2019-09-21 21:32:34

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

2013-06-24 15:16:29

Java字符串拼接

2020-11-19 07:51:06

StringJoine分隔符使用

2024-03-18 00:00:00

CalendaJava8Date

2022-11-25 07:53:26

bash腳本字符串

2024-03-11 08:21:49

2021-06-11 18:08:00

Java字符串拼接

2023-02-01 10:40:01

2023-10-31 18:57:02

Java字符串

2025-01-03 08:31:43

2024-03-21 08:55:41

享元模式對象內(nèi)存

2024-10-28 10:55:50

Jedis組件客戶端
點贊
收藏

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