gpt4 book ai didi

java - Java 8 中函数类型全等 lambda 表达式的使用

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:30 26 4
gpt4 key购买 nike

我对

的定义和用法感到困惑
Stream.collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)

method在 Java 8 中。

方法签名包括BiConsumer键入的参数。 BiConsumer FunctionalInterface 定义了一种功能方法 accept(Object, Object) .据我了解,我现在可以使用任何 lambda 表达式,即 congruent到这个功能接口(interface)。

但是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 方法中的累加器函数。

如您所见,我显然缺乏理解并感谢任何解释。

最佳答案

累加器 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);
}
}
);

关于java - Java 8 中函数类型全等 lambda 表达式的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26862874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com