collect补充

简介: collect补充

青年之文明,奋斗之文明也,与境遇奋斗,与时代奋斗,与经验奋斗。故青年者,人生,人生之春,人生之华也。——李大钊

书接上文,我们讲到并行流场景下三个参数的reduce会有一个坑

同理,在collect函数中也有这个坑

我们先使用普通流去做

// 生成1-100
List<Integer> list = Stream.iterate(1, i -> ++i).limit(200).collect(Collectors.toList());
System.out.println(list);
// 使用collect函数进行转换为List<Map<Integer,Integer>>,包含值和线程id
List<Map<String, Object>> result = list.stream().collect(() -> {
    System.out.println("第一个参数:Supplier,我们返回一个带初始值的List,放进去三个负数");
    Map<String, Object> map1 = new HashMap<>();
    // 获取线程id
    long threadId = Thread.currentThread().getId();
    // 放入一个值为负数,只有一个元素的map
    map1.put("value", -1);
    map1.put("threadId", threadId);
    List<Map<String, Object>> currentList = new ArrayList<>();
    // 将map添加进去
    currentList.add(map1);
    return currentList;
}, (lastList, value) -> {
    // 具体的聚合操作,将value封装为map,加上线程id,放入list
    HashMap<String, Object> map = new HashMap<>();
    map.put("value", value);
    map.put("threadId", Thread.currentThread().getId());
    lastList.add(map);
}, (lastList, currentList) -> {
    // 并行流下合计上面多个结果
    System.out.println("lastList:" + lastList);
    lastList.addAll(currentList);
    System.out.println("currentList:" + currentList);
});
System.out.println("最终结果:" + result);
System.out.println("最终结果个数:" + result.size());

运行结果

初始值一个,加上我们200个元素,最后201个元素,并且线程id全是1,说明是主线程

换成并行流,则变成了264个元素:初始值1个,64个线程,一共64个,加上我们200个元素,则变成了264个元素,并且线程id五花八门,有相同的也有不同的,说明是多个线程去并行执行

同样要注意,可能我的最大线程数并没有这么多,一些线程可能会被重复使用,因此累加次数可能是大于最大线程数

// 生成1-100
List<Integer> list = Stream.iterate(1, i -> ++i).limit(200).collect(Collectors.toList());
System.out.println(list);
// 使用collect函数进行转换为List<Map<Integer,Integer>>,包含值和线程id
List<Map<String, Object>> result = list.stream().parallel().collect(() -> {
    System.out.println("第一个参数:Supplier,我们返回一个带初始值的List,放进去三个负数");
    Map<String, Object> map1 = new HashMap<>();
    // 获取线程id
    long threadId = Thread.currentThread().getId();
    // 放入一个值为负数,只有一个元素的map
    map1.put("value", -1);
    map1.put("threadId", threadId);
    List<Map<String, Object>> currentList = new ArrayList<>();
    // 将map添加进去
    currentList.add(map1);
    return currentList;
}, (lastList, value) -> {
    // 具体的聚合操作,将value封装为map,加上线程id,放入list
    HashMap<String, Object> map = new HashMap<>();
    map.put("value", value);
    map.put("threadId", Thread.currentThread().getId());
    lastList.add(map);
}, (lastList, currentList) -> {
    // 并行流下合计上面多个结果
    System.out.println("lastList:" + lastList);
    lastList.addAll(currentList);
    System.out.println("currentList:" + currentList);
});
System.out.println("最终结果:" + result);
System.out.println("最终结果个数:" + result.size());

注意这里我们使用的Stream.parallel()去转换为并行流

要是看不太懂,可以跟着上篇

相关文章
|
11月前
|
SQL 分布式计算 大数据
`collect_set`函数用于将一组数据收集到一个集合中
`collect_set`函数用于将一组数据收集到一个集合中
185 1
|
10月前
|
流计算
reduce补充二
reduce补充二
37 0
|
索引
一点通透:map与forEach的用法
一点通透:map与forEach的用法
248 0
|
前端开发 Java 程序员
【List转Map操作】Collectors.toMap语法分享(案例实践)
在真实的业务场景中有很多集合转map的操作,今天一起学习一下Collectors.toMap相关使用!
418 0
【List转Map操作】Collectors.toMap语法分享(案例实践)
|
存储 SQL Java
java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)
java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)
java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)
|
开发框架 算法 Java
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(上)
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(上)
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(上)
|
存储 并行计算 算法
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(中)
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(中)
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(中)
|
SQL 安全 Java
JDK1.8新特性(六):Stream的终极操作,轻松解决集合分组、汇总等复杂操作
本文将讲述关于Stream的终极操作,让你轻松解决集合的分组、汇总等操作,让其他同事对你刮目相看。
789 0
|
索引
数组reduce方法的高级用法
因为用for循环被老大鄙视之后,这几天都在偷偷摸摸的研究数组的那几个迭代方法。 使用下来,感觉确实妙用无穷,仿佛自己的逼格在无形中变得高大了一点点,哈哈,上一篇文章的简单介绍确实有点糙,因此决定重新一些总结文章。这篇文章就是专门总结reduce方法的,这个方法大有可研究的地方,值得大家get它并去动手实践一下。 上一篇文章我认为reduce是一个聚合或者减少方法,它可以将数组中的每一项通过叠加变成一项,但是其实这种说法似乎不太准确。先不管这个,我们来看看例子再说。
168 0
|
存储 安全 Java
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(下)
【小家java】java8新特性之---Stream API 详解 (Map-reduce、Collectors收集器、并行流、groupby多字段分组)(下)