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-

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值