中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談Java8對字符串連接的改進正確姿勢

發布時間:2020-08-23 14:41:46 來源:腳本之家 閱讀:146 作者:Coder編程 欄目:編程語言

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

毋庸置疑, Java8 之前我們的第一反應是使用 StringBuilder

public static String formatList(List<String> 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<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

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

運行結果: 淺談Java8對字符串連接的改進正確姿勢

JDK1.8 時,添加了一個新的用于字符串連接的類,專門用于這種需要 分隔符 的場合,它就是 StringJoinerStringJoiner 在構造時可以指定一個分隔符(delimiter),然后每連接一個元素它便會加上一個 delimiter ,使用 StringJoiner 改寫 formatList

public static String formatList(List<String> 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<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

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

運行結果:

淺談Java8對字符串連接的改進正確姿勢

formatList 的代碼更加的簡潔了 —— 當然我們還可以更簡潔 —— JDK1.8 為 String 類添加了一個新的靜態方法, String.join

淺談Java8對字符串連接的改進正確姿勢

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

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

當然,我們能猜到, String.join 方法的功能內部是通過 StringJoiner 來實現的, String.join (CharSequence, Iterable) 的源碼:

淺談Java8對字符串連接的改進正確姿勢

但是我們看到了 String.join 方法的不足 —— 它不能指定前綴和后綴 —— 比如我們如果想要直接將 List<String> 格式化為 { 元素1, 元素2, 元素3, ... 元素N } 呢?(此時前綴為 "{ " ,后綴為 " }"

查看 StringJoiner 的構造方法,發現 StringJoiner 除了指定 分隔符 的構造方法,還有一個可以指定 分隔符、前綴和后綴 的構造方法:

淺談Java8對字符串連接的改進正確姿勢

修改 formatList

public static String formatList(
  List<String> 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<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

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

運行結果:

淺談Java8對字符串連接的改進正確姿勢

很棒~ 但能不能更簡潔呢? 事實上, Java8 對于字符串集合的連接操作提供了一個專門的流式 API,即 Collectors.joining

函數:!

淺談Java8對字符串連接的改進正確姿勢

無參的 joining() 方法,即不存在連接符(底層實現為 StringBuilder);

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

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

那怎么使用呢? 我們直接使用三個參數的 Collectors.joining 方法改寫 formatList:

public static String formatList(
  List<String> 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<String> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g");

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

運行結果:

淺談Java8對字符串連接的改進正確姿勢

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凌源市| 临沂市| 开江县| 辽源市| 泰宁县| 锡林浩特市| 夏河县| 同德县| 凤山县| 大庆市| 泾源县| 湘乡市| 措勤县| 东乡县| 临漳县| 沁阳市| 临夏县| 石楼县| 昆明市| 扎鲁特旗| 九龙县| 孟州市| 宁陕县| 宿迁市| 娄底市| 江川县| 兴文县| 安乡县| 临澧县| 沭阳县| 固阳县| 观塘区| 曲松县| 张掖市| 新田县| 呼伦贝尔市| 三门县| 宣武区| 田东县| 吉木萨尔县| 银川市|