Int流和收集

Lex*_*yte 4 java java-8 java-stream

所以我无法理解这个供应商,蓄能器和合并器的原理IntStream.我找到了一个例子.

IntStream.range(6,11)
         .collect(StringBuilder::new, 
                  StringBuilder::appendCodePoint,
                  StringBuilder::append);
Run Code Online (Sandbox Code Playgroud)

有人介意解释这StringBuilder::appendCodePoint部分吗?

syn*_*gma 6

让我们将这个流包装byte[]起来,然后String从结果数组中取出:

Arrays.toString(IntStream.range(6,11).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString().getBytes())
Run Code Online (Sandbox Code Playgroud)

这会给我们:

[6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

收集如何运作?

它接受流6..10并按以下顺序收集它:

  1. 它构建了一个新StringBuilder实例
  2. 累积,即将Unicode代码点附加StringBuilder::appendCodePoint到累加器.(等同于:(StringBuilder sb, int x) -> sb.appendCodePoint(x))
  3. 结合起来,即将(2)的结果添加到StringBuilder(1)中创建的实例中.(等同于:(StringBuilder sb1, StringBuilder sb2) -> sb1.append(sb2))

此参数化collect()调用的类型签名如下所示:

collect(Supplier<StrinBuilder> supplier,
                  ObjIntConsumer<StrinBuilder> accumulator,
                  BiConsumer<StrinBuilder, StrinBuilder> combiner);
Run Code Online (Sandbox Code Playgroud)