我最近在研究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和累加器从现有集合创建可变集合。
但是很难理解在这个过程中哪里需要组合器。
对于非静态方法引用,对象(在您的示例中是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
在合并器的情况下,当涉及并行流时,仅当在不同线程中创建多个列表时,才用于合并多个列表。