本文目标:开发人员,在了解JDK8的StringJoiner特性的条件下,进行更简介的字符串拼接操作,达到简化代码的程度。
1 why
StringBuilder拼接包含分隔符的字符序列时,分隔符需要一个一个添加,或者需要手动删除末尾冗余的分隔符,代码不美观,不好看。
比如,单个字符串依次拼接时:
StringBuilder sb = new StringBuilder();
sb.append("apple");
sb.append(",");
sb.append("orange");
sb.append(",");
sb.append("milk");
String str = sb.toString();
以及字符串集合循环拼接时:
StringBuilder sb = new StringBuilder();
for (String s:foodList) {
sb.append(s);
sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
String str = sb.toString();
StringJoiner很好的解决了这个问题。
2 what
StringJoiner:用于构造由分隔符分隔的字符序列,并且可选前缀、后缀。内部实际是基于StringBuilder实现。
由于本文只使用StringJoiner替换StringBuilder,生成带分隔符的字符序列,所以与之无关的功能不介绍,详情可以参见jdk1.8官网手册。
如图,需要用到的有StringJoiner本身提供的StringJoiner构造方法、add方法、toString方法,以及String类中通过StringJoiner实现的join方法。
(1)StringJoiner构造方法
public StringJoiner(CharSequence delimiter) {
this(delimiter, "", "");
}
创建对象时,可以指定分隔符。
(2)add方法
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
外层使用的prepareBuilder()方法,及StringBuilder的append方法,继续查看prepareBuilder方法:
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
也是用的StringBuilder的append方法,区别是增加了prefix(前缀,用于在输出的字符序列最前面添加用户自定义的字符,比如[)。
(3)toString方法
@Override
public String toString() {
if (value == null) {
return emptyValue;
} else {
if (suffix.equals("")) {
return value.toString();
} else {
int initialLength = value.length();
String result = value.append(suffix).toString();
// reset value to pre-append initialLength
value.setLength(initialLength);
return result;
}
}
}
(4)String类的join方法
public static String join(CharSequence delimiter, CharSequence... elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
可以看到实际是调用StringJoiner实现的。
此处,实现了suffix(分隔符)的填充操作。
至此介绍完毕相关功能,后面进行尝试。
3 how
(1)单个字符串依次拼接时:
简单字符,可直接使用String类的join方法。
String result = String.join(",", "aaa", "bbb" ,"ccc");
第一个入参是分隔符,后面依次添加要追加的字符串。
字符串内容复杂时,使用StringJoiner。
StringJoiner sj = new StringJoiner(",");
sj.add("apple");
sj.add("orange");
sj.add("milk");
String str = sj.toString();
(2)字符串集合循环拼接时:
List<String> foodList = new ArrayList<String>();
foodList.add("apple");
foodList.add("orange");
foodList.add("milk");
StringJoiner sj = new StringJoiner(",");
for (String s:foodList) {
sj.add(s);
}
String str = sj.toString();
和一开始StringBuilder的方式比较下,是不是简洁许多?
4 练习手段
可以参照“3 how”章节,尝试在自己的项目中,替换原本使用StringBuilder生成包含分隔符的字符序列功能。