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

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

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

[[394661]]

 前言

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

介紹

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

  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類的構造函數,還可以做到可選擇性地從我們自定義的前綴開始和自定義的后綴結尾,比較靈活和實用。 

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

輸出結果:[xiao,zhi]

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

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

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

源碼

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

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

  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.         //默認前綴和后綴為"",重載調用  
  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;//空值被設置為只有前后綴  
  24.     }  
  25.  //設置空值,檢查是否為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.             //沒有值將返回空值或者后續設置的空值  
  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后續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編程
相關推薦

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

分庫分表分布式

2019-09-21 21:32:34

數據庫SQL分布式

2011-07-11 16:00:22

字符串拼接

2020-11-19 07:51:06

StringJoine分隔符使用

2013-06-24 15:16:29

Java字符串拼接

2024-03-18 00:00:00

CalendaJava8Date

2024-03-11 08:21:49

2022-11-25 07:53:26

bash腳本字符串

2023-02-01 10:40:01

2021-06-11 18:08:00

Java字符串拼接

2021-12-06 17:44:56

MHAMySQL高可用

2024-10-28 10:55:50

Jedis組件客戶端

2023-02-27 08:53:54

JedislettuceRedis

2024-03-21 08:55:41

享元模式對象內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品一区| 免费小视频在线观看 | 日韩激情在线 | 无人区国产成人久久三区 | 精品国产乱码久久久久久影片 | 免费在线观看av | 99亚洲| 亚洲一区视频在线 | 日韩av免费在线观看 | 久久精品亚洲精品国产欧美 | 免费人成在线观看网站 | 日韩看片| 欧美成人激情 | 国产免费一区二区三区免费视频 | 在线观看国产三级 | 国产精品福利在线观看 | 伊人网91| 亚洲一区二区三区在线免费 | 亚洲一区免费视频 | 国产精品美女久久久久久免费 | 国产日产欧产精品精品推荐蛮挑 | 日本在线视频一区二区 | 久久久天天 | 欧美色性 | 一级片在线观看 | 久久99蜜桃综合影院免费观看 | 欧美中文在线 | 午夜寂寞影院在线观看 | 日韩精品久久久 | 国产精品欧美一区二区三区 | 日韩欧美三级电影在线观看 | 9191av| 精品伦精品一区二区三区视频 | 国产在线1区 | 欧美精品在线一区 | 欧美成人免费在线视频 | 日本三级日产三级国产三级 | 成人国产精品免费观看 | 日本aⅴ中文字幕 | 亚洲日韩中文字幕一区 | 黄色av网站在线免费观看 |