为了账号安全,请及时绑定邮箱和手机立即绑定

可变还原为 StringBuilder 对象

可变还原为 StringBuilder 对象

慕侠2389804 2024-01-05 15:14:43
根据Java Stream Package Summary,可变归约操作在处理流中的元素时将输入元素累积到可变结果容器中,例如 Collection 或StringBuilder 。有许多示例可以将可变归约执行到集合中。但是,我无法弄清楚如何在 StringBuilder 中实现可变归约操作,特别是考虑到 StringBuilder 似乎不属于任何相关接口定义的一部分。
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

您看不到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);

}


查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信