在Java 8中使用函数类型congruent lambda表达式

FrV*_*aBe 10 java lambda java-8

我挣扎着定义和使用

Stream.collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
Run Code Online (Sandbox Code Playgroud)

Java 8中的方法.

方法签名包括BiConsumer类型参数.BiConsumer FunctionalInterface定义了一个函数方法accept(Object,Object).据我所知,我现在可以使用任何与此功能接口一致的 lambda表达式.

但是Stream.collect JavaDoc中提到的示例是例如

 List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么ArrayList.add(E e)(单个参数)与BiConsumer.accept(T t,U u)方法(两个参数)一致,并且可以用作collect方法中的累加器函数.

如你所见,我显然缺乏理解并欣赏任何解释.

Boa*_*ann 12

累加器BiConsumer的两个参数是(1)列表本身和(2)要添加到其中的项目.这个:

List<String> asList = stringStream.collect(
    ArrayList::new,
    ArrayList::add,
    ArrayList::addAll
);
Run Code Online (Sandbox Code Playgroud)

相当于:

List<String> asList = stringStream.collect(
    () -> new ArrayList<>(),
    (list, item) -> list.add(item),
    (list1, list2) -> list1.addAll(list2)
);
Run Code Online (Sandbox Code Playgroud)

这将得到与此相同的结果:

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);
        }
    }
);
Run Code Online (Sandbox Code Playgroud)


Mis*_*sha 9

ArrayList::add实际上有2个参数.ArrayList您调用add方法和参数的对象add.

ArrayList::add相当于(list, element) -> list.add(element),所以它作为一个BiConsumer