为什么我们已经有StringBuilder的StringJoiner?

时间:2014-12-17 09:45:32

标签: java string java-8 stringbuilder

我最近遇到了一个Java 8类StringJoiner,它使用分隔符添加了String并为其添加了前缀和后缀,但是我不能理解这个类的需要,因为它也使用{{ 3}}在后端并且还执行非常简单的附加字符串的操作。

我是否因为没有真正理解这门课程的真正目的而错过了什么?

5 个答案:

答案 0 :(得分:63)

当您需要在StringJoiner中加入字符串时,

Stream非常有用。

例如,如果你必须遵循字符串列表:

final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");

使用

要简单得多
final String collectJoin = strings.stream().collect(Collectors.joining(", "));

StringBuilder

一样
final String collectBuilder =
    strings.stream().collect(Collector.of(StringBuilder::new,
        (stringBuilder, str) -> stringBuilder.append(str).append(", "),
        StringBuilder::append,
        StringBuilder::toString));

答案 1 :(得分:19)

StringJoiner Javadoc上的示例非常擅长涵盖此问题。整个要点是从添加条目的行为中抽象出分离器的选择。例如你可以创建一个木匠,指定要使用的分隔符并将其传递给库来添加元素,反之亦然。

  

The String&#34; [George:Sally:Fred]&#34;可以如下构建:

StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();
     

可以使用StringJoiner使用Collectors.joining(CharSequence)从Stream创建格式化输出。例如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
    .map(i -> i.toString())
    .collect(Collectors.joining(", "));

答案 2 :(得分:13)

在某些用例中,它可能会简化您的代码:

List<String> list = // ...;

// with StringBuilder
StringBuilder builder = new StringBuilder();
builder.append("[");
if (!list.isEmpty()) {
    builder.append(list.get(0));
    for (int i = 1, n = list.size(); i < n; i++) {
        builder.append(",").append(list.get(i));
    }
}
builder.append("]");

// with StringJoiner
StringJoiner joiner = new StringJoiner(",", "[", "]");
for (String element : list) {
    joiner.add(element);
}

答案 3 :(得分:10)

StringJoiner是一种收集器,虽然它没有实现Collector接口。它只是表现得这样。除了你可以传递分隔符,前缀和后缀之外,可以使用StringJoiner来创建Stream调用Collectors.joining(CharSequence)的格式化输出。

这在使用并行流时尤其有用,因为在某些时候,并行处理的批次需要加入,这就是{ {1}}发生。

答案 4 :(得分:2)

StringJoiner比使用StringBuilder简单得多。一个非常简单的代码就像

StringJoiner sj = new StringJoiner(",");
        sj.add("aaa");
        sj.add("bbb");
        sj.add("ccc");
        String result = sj.toString(); //aaa,bbb,ccc