我最近遇到了一个Java 8类StringJoiner
,它使用分隔符添加字符串,并添加前缀和后缀,但我不明白这个类的需求,因为它在后台也使用StringBuilder
,并且执行很简单的字符串追加操作。
我没有真正理解这个类的实际目的吗?
我最近遇到了一个Java 8类StringJoiner
,它使用分隔符添加字符串,并添加前缀和后缀,但我不明白这个类的需求,因为它在后台也使用StringBuilder
,并且执行很简单的字符串追加操作。
我没有真正理解这个类的实际目的吗?
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));
编辑六年后
正如评论中所指出的,现在有更简单的解决方案,比如String.join(", ", strings)
,这些在过去是不可用的。但使用情况仍然相同。
.joining
的额外之处。通常情况下,您不需要最后一个逗号... - KoshinaeString.join(", ", strings)
是strings.stream().collect(Collectors.joining(", "))
的更快版本。 - Nicolas Seillerlist.stream().map(Util::quote).collect(Collectors.joining(","))
是什么意思? - Florian F在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<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
.map(i -> i.toString())
.collect(Collectors.joining(", "));
在某些使用情况下,它可能会简化您的代码:
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);
}
StringJoiner
是一种Collector,虽然它没有实现Collector
接口,但它的行为就像一个Collector。此外,你可以传递分隔符、前缀和后缀,StringJoiner
可用于从Stream
调用Collectors.joining(CharSequence)
来创建格式化输出。StringJoiner
的用武之地。StringJoiner比使用StringBuilder要简单得多。一个非常简单的代码就像
StringJoiner sj = new StringJoiner(",");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
String result = sj.toString(); //aaa,bbb,ccc