java-为什么我们已经拥有StringBuilder时使用StringJoiner?
我最近遇到了Java 8类StringBuilder,该类使用定界符添加String并向其添加前缀和后缀,但是我无法理解此类的需要,因为该类还在后端使用StringBuilder并且还执行了非常简单的操作 附加字符串。
我是否没有真正理解本堂课的真正目的而错过了某些东西?
5个解决方案
65 votes
当您需要在Stream中连接字符串时,StringBuilder非常有用。
例如,如果您必须遵循以下字符串列表:
final List 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));
Martin Seeler answered 2020-01-02T08:55:28Z
22 votes
StringJoiner Javadoc上的示例非常擅长介绍这一点。 整个要点是从添加条目的行为中抽象出分隔符的选择。 例如 您可以创建一个连接器,指定要使用的分隔符,然后将其传递给库以添加元素,反之亦然。
字符串“ [George:Sally:Fred]”的构造如下:
StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();
可以使用StringJoiner使用Collectors.joining(CharSequence)从Stream创建格式化的输出。 例如:
List numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
.map(i -> i.toString())
.collect(Collectors.joining(", "));
Peter Lawrey answered 2020-01-02T08:56:06Z
14 votes
在某些情况下,它可以简化您的代码:
List 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);
}
sp00m answered 2020-01-02T08:56:26Z
11 votes
StringJoiner是一种收集器,尽管它没有实现Collector接口。 它只是这样表现。 除了可以传递定界符,前缀和后缀之外,还可以使用StringJoiner调用Collectors.joining(CharSequence)从Stream创建格式化的输出。
当使用并行流时,这特别有用,因为在某些时候,将需要并行处理的批处理,这就是StringJoiner发生的地方。
Konstantin Yovkov answered 2020-01-02T08:56:51Z
3 votes
StringJoiner比使用StringBuilder简单得多。 一个非常简单的代码就像
StringJoiner sj = new StringJoiner(",");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
String result = sj.toString(); //aaa,bbb,ccc
Shubham Pandey answered 2020-01-02T08:57:11Z