提问者:小点点

方法引用和收集流方法的机制


我最近在研究java函数界面,想知道方法参考是如何在收集流方法上工作的。

在java留档上,收集方法得到3个参数:供应商、累加器和组合器。

collect(
        Supplier<R> supplier, 
        BiConsumer<R,? super T> accumulator, 
        BiConsumer<R,R> combiner
)

...这是示例代码。

 List<String> asList = stringStream.collect(
       ArrayList::new,     // suplier?
       ArrayList::add,     // accumulator?
       ArrayList::addAll   // combiner?
 );

所以,我的问题是:

>

  • 参数类型

    正如您在上面的代码中看到的,收集方法接收Bi消费者接口作为累加器和组合器的参数。

    但是,ArrayList::add和ArrayList::addAll方法只接受一个参数(不是“Bi”,而是“一元”!)。

    我想知道这个代码怎么可能。这有什么隐藏的机制吗?

    合路器的用途

    我想知道合并器的目的是什么。

    我理解集合方法使用suplier和累加器从现有集合创建可变集合。

    但是很难理解在这个过程中哪里需要组合器。


  • 共1个答案

    匿名用户

    对于非静态方法引用,对象(在您的示例中是ArrayList实例)也作为参数传递。因此,将调用bicomumer,如图所示。

    List<Integer> list = new ArrayList<>();
    BiConsumer<List<Integer>, Integer> v1 = List::add;  // method reference
    BiConsumer<List<Integer>, Integer> v2 = (a,c)->a.add(c); //lambda
    

    他们都是这样称呼的。

    v1.accept(list, 10);
    v2.accept(list, 20);
    System.out.println(list);
    

    指纹

    10, 20
    

    在合并器的情况下,当涉及并行流时,仅当在不同线程中创建多个列表时,才用于合并多个列表。