根据Java流包摘要,可变缩减操作在处理流中的元素时,将输入元素累积到可变结果容器中,如Collection或StringBuilder
有很多例子可以将可变的归约到集合中。然而,我不知道如何在StringBuilder中实现可变的归约操作,特别是考虑到StringBuilder似乎不是任何相关接口定义的一部分。
您看不到StringBuilder
,因为使用StringBuilder
的结果是String
。StringBuilder
在幕后使用。
示例
String[] input = { "Hell", "oW", "orld" };
String joined = Stream.of(input).collect(Collectors.joining());
System.out.println(joined); // prints: HelloWorld
如果你在没有流媒体的情况下这样做,你会这样做:
StringBuilder buf = new StringBuilder();
for (String s : input)
buf.append(s);
String joined = buf.toString();
这也是溪流正在做的事情。如果你查看joining()
的源代码,你会发现:
public static Collector<CharSequence, ?, String> joining() {
return new CollectorImpl<CharSequence, StringBuilder, String>(
StringBuilder::new, StringBuilder::append,
(r1, r2) -> { r1.append(r2); return r1; },
StringBuilder::toString, CH_NOID);
}
如您所见,它还使用了new StringBuilder()
、append(CharSequence s)
和toString()
。
另外两个过载joining(CharSequence delimiter)
和joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
使用StringJoiner
而不是StringBuilder
。
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {
return joining(delimiter, "", "");
}
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
return new CollectorImpl<>(
() -> new StringJoiner(delimiter, prefix, suffix),
StringJoiner::add, StringJoiner::merge,
StringJoiner::toString, CH_NOID);
}