方法引用和收集流方法的机制
mechanism of method reference and collect stream method
我最近在研究 java 函数式接口,想知道方法引用如何专门用于 collect stream method。
在 java 文档中,collect 方法获取 3 个参数:supplier、accumulator 和 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::add所有方法都采用单个参数(不是“Bi”,而是“Unary”!)。
我想知道这段代码是怎么可能的。这有什么隐藏机制吗?
组合器的用途
不知道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
在组合器的情况下,当涉及并行流时,它仅用于在不同线程中创建多个列表时组合多个列表。
我最近在研究 java 函数式接口,想知道方法引用如何专门用于 collect stream method。
在 java 文档中,collect 方法获取 3 个参数:supplier、accumulator 和 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::add所有方法都采用单个参数(不是“Bi”,而是“Unary”!)。
我想知道这段代码是怎么可能的。这有什么隐藏机制吗?
组合器的用途
不知道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
在组合器的情况下,当涉及并行流时,它仅用于在不同线程中创建多个列表时组合多个列表。