【问题标题】:mechanism of method reference and collect stream method方法引用和收集流方法的机制
【发布时间】:2021-09-15 03:16:51
【问题描述】:

我最近在研究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::addAll 方法采用单个参数(不是“Bi”,而是“Unary”!)。

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

  2. 组合器的用途

    我想知道combiner的目的是什么。

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

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

【问题讨论】:

    标签: java functional-programming java-stream collect


    【解决方案1】:

    对于非静态方法引用,对象(在您的情况下为 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
    

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

    【讨论】:

    • Here 是我在 Infoworld 中找到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多