所以我很难理解 IntStream
中收集的这个供应商、累加器和组合器的原理。我找到了一个例子。
IntStream.range(6,11)
.collect(StringBuilder::new,
StringBuilder::appendCodePoint,
StringBuilder::append);
有人介意解释一下 StringBuilder::appendCodePoint
部分吗?
最佳答案
让我们包装这个流,从中生成 byte[]
,然后从结果数组中生成 String
:
Arrays.toString(IntStream.range(6,11).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString().getBytes())
这会给我们:
[6, 7, 8, 9, 10]
收集是如何工作的?
它获取 6..10
的流并按以下顺序收集它:
- 它构建了一个新的
StringBuilder
实例 - 它累加,即使用
StringBuilder::appendCodePoint
将 Unicode 代码点附加到累加器。 (相当于:(StringBuilder sb, int x) -> sb.appendCodePoint(x)
) - 它组合,即将 (2) 的结果添加到 (1) 中创建的
StringBuilder
实例中。 (相当于:(StringBuilder sb1, StringBuilder sb2) -> sb1.append(sb2)
)
此参数化 collect()
调用的类型签名如下所示:
collect(Supplier<StrinBuilder> supplier,
ObjIntConsumer<StrinBuilder> accumulator,
BiConsumer<StrinBuilder, StrinBuilder> combiner);
关于java - Int 流和收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44421779/