java stream collect(Supplier,BiConsumer,BiConsumer)

<R> R collect(Supplier<R> supplier,
              BiConsumer<R,? super T> accumulator,
              BiConsumer<R,R> combiner)

参数一:supplier 接口的get方法,提供一个容器(List,Map,Set),作为accumulator和combiner的参数,并且是最后的返回值(同被R泛型约束)
参数二:accumulator接口的accept方法来处理supplier提供的R类型容器,和stream中的元素,比如将元素添加到容器中去.对stream进行局部聚合.
参数三:combiner接口的accept方法来处理局部accumulator产生的R类型容器.对局部结果进行全局聚合

有三种写法,注意之间的对应关系

1.使用实现类样例

package com;

import java.util.LinkedList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Supplier;

public class App2 {
    
    
    public static void main(String[] args) {
    
    
        LinkedList<Integer> integers = new LinkedList<>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        List res = integers.stream().collect(
                new Supplier<List>() {
    
    
                    @Override
                    public List get() {
    
    
                        return new LinkedList();
                    }
                },
                new BiConsumer<List, Integer>() {
    
    
                    @Override
                    public void accept(List list, Integer integer) {
    
    
                        list.add(integer);
                    }
                },
                new BiConsumer<List, List>() {
    
    
                    @Override
                    public void accept(List list, List list2) {
    
    
                        list.addAll(list2);
                    }
                }
        );
        System.out.println(res);
    }
}

2.使用lambda样例

package com;

import java.util.LinkedList;
import java.util.List;

public class App2 {
    
    
    public static void main(String[] args) {
    
    
        LinkedList<Integer> integers = new LinkedList<>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        List res = integers.stream().collect(
                ()->new LinkedList(),
                (list, integer) -> list.add(integer),
                (list1,list2) -> list1.addAll(list2)
        );
        System.out.println(res);
    }
}

3.使用方法引用

package com;

import java.util.LinkedList;
import java.util.List;

public class App2 {
    
    
    public static void main(String[] args) {
    
    
        LinkedList<Integer> integers = new LinkedList<>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        List res = integers.stream().collect(
                LinkedList::new,
                List::add,
                List::addAll
        );
        System.out.println(res);
    }
}

参考:
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.function.Supplier-java.util.function.BiConsumer-java.util.function.BiConsumer-

猜你喜欢

转载自blog.csdn.net/claroja/article/details/114048061