真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

我們提出一個(gè)需求:有一個(gè) List,將其格式化為 元素1, 元素2, 元素3, ... 元素N 的字符串形式。

創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、延津網(wǎng)絡(luò)推廣、微信小程序開(kāi)發(fā)、延津網(wǎng)絡(luò)營(yíng)銷(xiāo)、延津企業(yè)策劃、延津品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供延津建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):18982081108,官方網(wǎng)址:www.cdcxhl.com

毋庸置疑, Java8 之前我們的第一反應(yīng)是使用 StringBuilder

public static String formatList(List list, String delimiter) {
 StringBuilder result = new StringBuilder();
 for (String str : list) {
  result.append(str).append(delimiter);
 }
 // 刪除末尾多余的 delimiter
 result.delete(result.length() - delimiter.length(), result.length()); 
 
 return result.toString();
}

public static void main(String[] args) throws Exception {
 List list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

 System.out.println("使用 StringBuilder:");
 String format = formatList(list, ", ");
 System.out.println(format);
}

運(yùn)行結(jié)果: 淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

JDK1.8 時(shí),添加了一個(gè)新的用于字符串連接的類(lèi),專(zhuān)門(mén)用于這種需要 分隔符 的場(chǎng)合,它就是 StringJoiner 。 StringJoiner 在構(gòu)造時(shí)可以指定一個(gè)分隔符(delimiter),然后每連接一個(gè)元素它便會(huì)加上一個(gè) delimiter ,使用 StringJoiner 改寫(xiě) formatList

public static String formatList(List list, String delimiter) {
 StringJoiner result = new StringJoiner(delimiter);
 for (String str : list) {
  result.add(str);
 }
 return result.toString();
}

public static void main(String[] args) throws Exception {
 List list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

 System.out.println("使用 StringJoiner:");
 String format = formatList(list, ", ");
 System.out.println(format);
}

運(yùn)行結(jié)果:

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

formatList 的代碼更加的簡(jiǎn)潔了 —— 當(dāng)然我們還可以更簡(jiǎn)潔 —— JDK1.8 為 String 類(lèi)添加了一個(gè)新的靜態(tài)方法, String.join

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

可以看到,第一個(gè)參數(shù)為一個(gè)分隔符 delimiter ,第二個(gè)參數(shù)可以是一個(gè) Iterable ,或者是一個(gè)變長(zhǎng)參數(shù)的 CharSequenceString 就是 CharSequence 的子類(lèi))。 所以 formatList 方法只需要一句代碼就搞定:

public static String formatList(List list, String delimiter) {
 return String.join(delimiter, list);
}

當(dāng)然,我們能猜到, String.join 方法的功能內(nèi)部是通過(guò) StringJoiner 來(lái)實(shí)現(xiàn)的, String.join (CharSequence, Iterable) 的源碼:

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

但是我們看到了 String.join 方法的不足 —— 它不能指定前綴和后綴 —— 比如我們?nèi)绻胍苯訉?List 格式化為 { 元素1, 元素2, 元素3, ... 元素N } 呢?(此時(shí)前綴為 "{ " ,后綴為 " }"

查看 StringJoiner 的構(gòu)造方法,發(fā)現(xiàn) StringJoiner 除了指定 分隔符 的構(gòu)造方法,還有一個(gè)可以指定 分隔符、前綴和后綴 的構(gòu)造方法:

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

修改 formatList

public static String formatList(
  List list, String delimiter, String prefix, String suffix) {

 StringJoiner result = new StringJoiner(delimiter, prefix, suffix);
 for (String str : list) {
  result.add(str);
 }
 return result.toString();
}

public static void main(String[] args) throws Exception {
 List list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

 System.out.println("使用 StringJoiner,帶前綴和后綴:");
 String format = formatList(list, ", ", "{ ", " }");
 System.out.println(format);
}

運(yùn)行結(jié)果:

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

很棒~(yú) 但能不能更簡(jiǎn)潔呢? 事實(shí)上, Java8 對(duì)于字符串集合的連接操作提供了一個(gè)專(zhuān)門(mén)的流式 API,即 Collectors.joining

函數(shù):!

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

無(wú)參的 joining() 方法,即不存在連接符(底層實(shí)現(xiàn)為 StringBuilder);

joining(CharSequence delimiter) 方法,即分隔符為 delimiter(底層實(shí)現(xiàn)為 StringJoiner);j

oining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)方法,即分隔符為 delimiter,前綴為 prefix,后綴為 suffix(底層實(shí)現(xiàn)為 StringJoiner)。

那怎么使用呢? 我們直接使用三個(gè)參數(shù)的 Collectors.joining 方法改寫(xiě) formatList:

public static String formatList(
  List list, String delimiter, String prefix, String suffix) {

 return list.stream().collect(Collectors.joining(delimiter, prefix, suffix));
}

public static void main(String[] args) throws Exception {
 List list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

 System.out.println("使用 Collectors.joining:");
 String format = formatList(list, ", ", "{ ", " }");
 System.out.println(format);
}

運(yùn)行結(jié)果:

淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)

查看 StringJoiner 的源碼,我們可以知道 StringJoiner 的底層實(shí)現(xiàn)就是 StringBuilder —— Java8 將 使用分隔符連接多個(gè)字符串 這一功能進(jìn)行封裝,提供這么多易用且簡(jiǎn)介的 API,確實(shí)在很大程度上方便了編碼。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


本文標(biāo)題:淺談Java8對(duì)字符串連接的改進(jìn)正確姿勢(shì)
URL鏈接:http://weahome.cn/article/gicehi.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部