当前位置: 首页 > 知识库问答 >
问题:

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

孙财
2023-03-14

我最近在研究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个答案

    百里涛
    2023-03-14

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

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

     类似资料:
    • 集成方法: ensemble method(元算法:meta algorithm) 概述 概念:是对其他算法进行组合的一种形式。 通俗来说: 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。 机器学习处理问题时又何尝不是如此? 这就是集成方法背后的思想。 集成方法: 投票选举(bagging: 自举汇聚法 bootstrap aggregating): 是基于数据随机重抽样分类器

    • 本文向大家介绍Java 8中的收集器collectionAndThen()方法,包括了Java 8中的收集器collectionAndThen()方法的使用技巧和注意事项,需要的朋友参考一下 Java Collectors类中的collectingAndThen()方法调整收集器以执行额外的完成转换。它返回collector,collector执行下游collector的操作,然后执行附加的结束步

    • 本文向大家介绍Java 8中的收集器partitioningBy()方法,包括了Java 8中的收集器partitioningBy()方法的使用技巧和注意事项,需要的朋友参考一下 该方法返回一个收集器,该收集器根据谓词对输入元素进行分区,并将它们组织成Map <Boolean,List <T >>。 语法如下。 在这里,参数 T-输入元素的类型 谓词-用于组织输入元素 要使用Java中的Colle

    • 有没有java api可以让我跳过流直接操作集合(比如C#中的?):

    • 主要内容:1.方法引用,2.方法引用与lambda,3.方法引用的使用1.方法引用 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。 方法引用通过方法的名字来指向一个方法。 方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 方法引用使用一对冒号 :: 2.方法引用与lambda 3.方法引用的使用 静态方法引用 静态方法

    • 本文向大家介绍使用Java8中的方法引用来引用实例方法,包括了使用Java8中的方法引用来引用实例方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式中的名称来调用/引用和现有方法。 语法 以下是在Java中引用实例方法的语法