猿问

可变还原为 StringBuilder 对象

根据Java Stream Package Summary
可变归约操作在处理流中的元素时将输入元素累积到可变结果容器中,例如 Collection 或StringBuilder 。

有许多示例可以将可变归约执行到集合中。但是,我无法弄清楚如何在 StringBuilder 中实现可变归约操作,特别是考虑到 StringBuilder 似乎不属于任何相关接口定义的一部分。


慕侠2389804
浏览 97回答 1
1回答

守着一只汪

您看不到StringBuilder,因为使用 a 的结果StringBuilder是 a 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。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);}
随时随地看视频慕课网APP

相关分类

Java
我要回答