我对
的定义和用法感到困惑Stream.collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
Java 8中的
方法签名包括BiConsumer类型参数。 BiConsumer FunctionalInterface定义了一种函数方法accept(Object, Object)。据我所知,我现在可以使用congruent这个函数接口的lambda表达式。
但是Stream.collect JavaDoc中提到的例子就是例如。
List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
我不明白为什么ArrayList.add(E e)(单个参数)与BiConsumer.accept(T t, U u)方法(两个参数)一致,并且可以用作collect方法中的累加器函数。
如你所见,我显然缺乏理解并欣赏任何解释。
答案 0 :(得分:12)
累加器BiConsumer的两个参数是(1)列表本身和(2)要添加的项目。这样:
List<String> asList = stringStream.collect(
ArrayList::new,
ArrayList::add,
ArrayList::addAll
);
相当于:
List<String> asList = stringStream.collect(
() -> new ArrayList<>(),
(list, item) -> list.add(item),
(list1, list2) -> list1.addAll(list2)
);
将得到与此相同的结果:
List<String> asList = stringStream.collect(
new Supplier<ArrayList<String>>() {
@Override
public ArrayList<String> get() {
return new ArrayList<>();
}
},
new BiConsumer<ArrayList<String>,String>() {
@Override
public void accept(ArrayList<String> list, String item) {
list.add(item);
}
},
new BiConsumer<ArrayList<String>,ArrayList<String>>() {
@Override
public void accept(ArrayList<String> list1, ArrayList<String> list2) {
list1.addAll(list2);
}
}
);
答案 1 :(得分:9)
ArrayList::add
实际上有2个参数。您调用ArrayList
方法的add
对象和add
的参数。
ArrayList::add
相当于(list, element) -> list.add(element)
,因此它可以作为BiConsumer