常用方法
- 用
StringBuilder
实现 String.join()
- Stream api 收集的方法
joining()
- 方法2和3的底层实现
StringJoiner
代码演示
public class StringJoinerTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
String delimiter = ", ";
// 1.用StringBuilder实现
StringBuilder sb = new StringBuilder(list.isEmpty() ? "" : list.get(0));
for (int i = 1; i < list.size(); i++) {
sb.append(delimiter).append(list.get(i));
}
System.out.println("method 1: " + sb.toString());
// @since 1.8
// 2.String.join()
System.out.println("method 2: " + String.join(delimiter, list));
// 3.Stream api 收集的方法joining()
System.out.println("method 3.1: " + list.stream().collect(Collectors.joining()));
System.out.println("method 3.2: " + list.stream().collect(Collectors.joining(delimiter)));
System.out.println("method 3.3: " + list.stream().collect(Collectors.joining(delimiter, "{", "}")));
// 4. 方法2和3的底层实现StringJoiner
//StringJoiner sj = new StringJoiner(delimiter);
StringJoiner sj = new StringJoiner(delimiter, "(", ")");
for (String str : list) {
sj.add(str);
}
System.out.println("method 4: " + sj.toString());
}
}
返回值
method 1: a, b, c, d
method 2: a, b, c, d
method 3.1: abcd
method 3.2: a, b, c, d
method 3.3: {a, b, c, d}
method 4: (a, b, c, d)
StringJoiner 源码
StringJoiner add(CharSequence newElement)
将给定的副本CharSequence
值作为下一个元素StringJoiner
值。 如果newElement
为null ,则"null"加入。
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
private StringBuilder value;
重写了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;
}
}
}