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

gev0vcfq  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(332)

我最近在研究java函数接口,想知道方法引用是如何在收集流方法上工作的。
在java文档中,collect方法获得3个参数:supplier、acculator和combiner。

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?
 );

所以,我的问题是:
参数类型
正如您在上面的代码中所看到的,collect方法接收biconsumer接口作为累加器和组合器的参数。
但是,arraylist::add和arraylist::addall方法只接受一个参数(不是“bi”,而是“一元”!)。
我想知道这个代码怎么可能。这有什么隐藏的机制吗?
合路器的用途
我想知道合路器的用途是什么。
我知道collect方法使用suplier和累加器从现有集合创建可变集合。
但很难理解在这个过程中需要组合器的地方。

9q78igpj

9q78igpj1#

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

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

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

相关问题