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

mechanism of method reference and collect stream method

我最近在研究 java 函数式接口,想知道方法引用如何专门用于 collect stream method

在 java 文档中,collect 方法获取 3 个参数:supplieraccumulatorcombiner .

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

所以,我的问题是:

  1. 参数类型

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

    但是,ArrayList::add 和 ArrayList::add所有方法都采用单个参数(不是“Bi”,而是“Unary”!)。

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

  2. 组合器的用途

    不知道combiner的作用是什么

    我了解 collect 方法使用供应商和累加器从现有集合创建可变集合。

    但是很难理解这个过程中哪里需要combiner。

对于非静态方法引用,对象(在您的例子中 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

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