1. 對列表中的元素進行拼接
以前,對一個列表中的字符串進行拼接時,常見的代碼如示例1所示:
代碼示例1
List<String> ids = ImmutableList.of("1", "2", "3");
StringBuilder sb = new StringBuilder();
for (String id : ids) {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(id);
}
System.out.println(sb);
運行結果
1,2,3
示例1的代碼沒有問題,結果也是正確的,唯一的缺憾就是:代碼比較長。
在JDK8之后,上述代碼可以簡化:
代碼實例2
List<String> ids = ImmutableList.of("1", "2", "3");
System.out.println(String.join(",", ids));
運行結果
1,2,3
代碼由原來的9行縮短到2行,非常簡潔,最主要的是節省了時間(時間就是生命啊)。
JDK是如何實現的呢,源碼如下:
public static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
原來是使用了StringJoiner,StringJoiner是JDK8為了方便構造限定分隔符,甚至於給定前綴和后綴,而提供的一個類,示例代碼如下:
StringJoiner sj = new StringJoiner(",","{","}");
sj.add("first").add("second").add("third");
System.out.println(sj.toString());
運行結果
{first,second,third}
結合JDK8的stream,可以拼接列表元素:
List<Integer> numbers = ImmutableList.of(1, 2, 3, 4, 5);
System.out.println(numbers.stream().map(Object::toString).collect(Collectors.joining(",")));
運行結
1,2,3,4,5
2. 追加字符串
在開發的過程中,經常遇到將字符串追加到已有的字段中,例如:將用戶的一些數據追加到一個字段中。當時看到這個需求后,憑借第一印象,立即寫出了如下的代碼:
代碼實例3
User user = new User();
StringBuilder sb = new StringBuilder(user.getRemark());
List<String> ids = ImmutableList.of("1", "2", "3");
for (String id : ids) {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(id);
}
user.setRemark(sb.toString());
System.out.println(user);
運行,竟然報空指針異常,一口老血噴了出來。通過異常信息,結合StringBuilder源碼:
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
oh my god,在StringBuilder初始化時,為了初始化空間的大小,取了字符串的長度。然而,新用戶的remark字段是空的,取其長度,字段就報錯了。
結合前面學習的StringJoiner,新的代碼如下:
User user = new User();
List<String> ids = ImmutableList.of("1", "2", "3");
StringJoiner sj = new StringJoiner(",");
if (StringUtils.isNoneEmpty(user.getRemark())) {
sj.add(user.getRemark());
}
for (String id : ids) {
sj.add(id);
}
System.out.println(sj.toString());
運行結果
1,2,3
當然,如果還想再短一點,可以將for循環簡寫:
User user = new User();
List<String> ids = ImmutableList.of("1", "2", "3");
StringJoiner sj = new StringJoiner(",");
if (StringUtils.isNoneEmpty(user.getRemark())) {
sj.add(user.getRemark());
}
sj.add(String.join(",", ids));
System.out.println(sj.toString());