java8 多行字符串_Java8(2):Java8 对字符串连接的改进
我們提出一個需求:有一個 List,將其格式化為 元素1, 元素2, 元素3, ... 元素N 的字符串形式。
毋庸置疑,Java8 之前我們的第一反應是使用 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);
}
運行結果:
JDK1.8 時,添加了一個新的用于字符串連接的類,專門用于這種需要 分隔符 的場合,它就是 StringJoiner。StringJoiner 在構造時可以指定一個分隔符(delimiter),然后每連接一個元素它便會加上一個 delimiter,使用 StringJoiner 改寫 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);
}
運行結果:
formatList 的代碼更加的簡潔了 —— 當然我們還可以更簡潔 —— JDK1.8 為 String 類添加了一個新的靜態方法,String.join:
可以看到,第一個參數為一個分隔符 delimiter,第二個參數可以是一個 Iterable,或者是一個變長參數的 CharSequence(String 就是 CharSequence 的子類)。
所以 formatList 方法只需要一句代碼就搞定:
public static String formatList(List list, String delimiter) {
return String.join(delimiter, list);
}
當然,我們能猜到,String.join 方法的功能內部是通過 StringJoiner 來實現的,String.join (CharSequence, Iterable) 的源碼:
但是我們看到了 String.join 方法的不足 —— 它不能指定前綴和后綴 —— 比如我們如果想要直接將 List 格式化為 { 元素1, 元素2, 元素3, ... 元素N } 呢?(此時前綴為 "{ ",后綴為 " }")
查看 StringJoiner 的構造方法,發現 StringJoiner 除了指定 分隔符 的構造方法,還有一個可以指定 分隔符、前綴和后綴 的構造方法:
修改 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);
}
運行結果:
很棒~ 但能不能更簡潔呢? 事實上,Java8 對于字符串集合的連接操作提供了一個專門的流式 API,即 Collectors.joining 函數:
無參的 joining() 方法,即不存在連接符(底層實現為 StringBuilder);
joining(CharSequence delimiter) 方法,即分隔符為 delimiter(底層實現為 StringJoiner);
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)方法,即分隔符為 delimiter,前綴為 prefix,后綴為 suffix(底層實現為 StringJoiner)。
那怎么使用呢? 我們直接使用三個參數的 Collectors.joining 方法改寫 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);
}
運行結果:
查看 StringJoiner 的源碼,我們可以知道 StringJoiner 的底層實現就是 StringBuilder —— Java8 將 使用分隔符連接多個字符串 這一功能進行封裝,提供這么多易用且簡介的 API,確實在很大程度上方便了編碼。
總結
以上是生活随笔為你收集整理的java8 多行字符串_Java8(2):Java8 对字符串连接的改进的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯代理《全境封锁 2》国服体验服测试
- 下一篇: 文远知行宣布成为首家获准在北京开展无人清