Java Int流和收集

Java Int流和收集,java,java-8,java-stream,Java,Java 8,Java Stream,因此,我很难理解从IntStream收集的这个供应商、累加器和合路器的原理。我找到了一个例子 IntStream.range(6,11) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append); 有人介意解释一下StringBuilder::appendCodePoint部分吗?如果我们这样写

因此,我很难理解从
IntStream
收集的这个供应商、累加器和合路器的原理。我找到了一个例子

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

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

如果我们这样写会怎么样:

IntStream.range(6, 11)
          .collect(StringBuilder::new, 
             (StringBuilder sb, int x) -> sb.appendCodePoint(x),  
             StringBuilder::append);
collect(Supplier<StrinBuilder> supplier,
                  ObjIntConsumer<StrinBuilder> accumulator,
                  BiConsumer<StrinBuilder, StrinBuilder> combiner);
累加器是一个
使用者
,它接受一个
整数
作为参数,不返回任何内容


StringBuilder::appendCodePoint
是一个方法引用,其作用与lambda表达式相同

让我们将这个流包装成
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()
    调用的类型签名如下所示:

    IntStream.range(6, 11)
              .collect(StringBuilder::new, 
                 (StringBuilder sb, int x) -> sb.appendCodePoint(x),  
                 StringBuilder::append);
    
    collect(Supplier<StrinBuilder> supplier,
                      ObjIntConsumer<StrinBuilder> accumulator,
                      BiConsumer<StrinBuilder, StrinBuilder> combiner);
    
    收集(供应商、,
    ObjIntConsumer累加器,
    双消费组合器);
    
    很好的例子。谢谢你的解释。