所以我无法理解来自IntStream
的收集中的供应商,累加器和合并器的原理。我找到了一个例子。
IntStream.range(6,11)
.collect(StringBuilder::new,
StringBuilder::appendCodePoint,
StringBuilder::append);
有人介意解释StringBuilder::appendCodePoint
部分吗?
答案 0 :(得分:6)
让我们将此流包装成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)
)StringBuilder
实例中。 (相当于:(StringBuilder sb1, StringBuilder sb2) -> sb1.append(sb2)
)此参数化collect()
调用的类型签名如下所示:
collect(Supplier<StrinBuilder> supplier,
ObjIntConsumer<StrinBuilder> accumulator,
BiConsumer<StrinBuilder, StrinBuilder> combiner);
答案 1 :(得分:4)
如果我们这样写:
IntStream.range(6, 11)
.collect(StringBuilder::new,
(StringBuilder sb, int x) -> sb.appendCodePoint(x),
StringBuilder::append);
累加器是Consumer
,它以Integer
为参数并且不返回任何内容。
StringBuilder::appendCodePoint
是一个方法引用,它与lambda表达式的作用相同。