Int流和收集

时间:2017-06-07 20:00:59

标签: java java-8 java-stream

所以我无法理解来自IntStream的收集中的供应商,累加器和合并器的原理。我找到了一个例子。

IntStream.range(6,11)
         .collect(StringBuilder::new, 
                  StringBuilder::appendCodePoint,
                  StringBuilder::append);

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

2 个答案:

答案 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的流并按以下顺序收集它:

  1. 它构建了一个新的StringBuilder实例
  2. 累积,即使用StringBuilder::appendCodePoint将Unicode代码点附加到累加器。 (相当于:(StringBuilder sb, int x) -> sb.appendCodePoint(x)
  3. 组合,即将(2)的结果添加到(1)中创建的StringBuilder实例中。 (相当于:(StringBuilder sb1, StringBuilder sb2) -> sb1.append(sb2)
  4. 此参数化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表达式的作用相同。