常用方法
- 用
StringBuilder
實現(xiàn) String.join()
- Stream api 收集的方法
joining()
- 方法2和3的底層實現(xiàn)
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實現(xiàn)
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的底層實現(xiàn)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;
}
}
}