Stream 多字段求和、汇聚

  • 实现方法
  • 对象类型数据处理
  • Map类型数据处理

实现方法

利用Collectors.toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
keyMapper:代表你最终想要获得的Map<Key, Value> 的Key
valueMapper:代表你最终想要获得的Map<Key, Value> 的Value
mergeFunction:表示碰到Key冲突是处理过程,{x, y}中x是已汇聚对象,y表示当前处理对象

对象类型数据处理

public static Map<String, Model> streamGroupSum(List<Model> datas){return datas.stream().collect(Collectors.toMap(k -> k.getCode(), v -> v, (x, y) -> x.addCount().addAll(y)));}

Model

@Data
class Model{private String code;private int count = 0;private Integer sum1;private Integer sum2;public Model(String code, Integer sum1, Integer sum2){this.code = code;this.sum1 = sum1;this.sum2 = sum2;}public Model addCount(){this.count++;return this;}public Model addAll(Model y){return add(Model::setSum1, Model::getSum1, y).add(Model::setSum2, Model::getSum2, y);}/*** 使用函数式编程,最终目的是为了求和,类似反射,具体使用方式请移步函数式编程*/public Model add(BiConsumer<Model, Integer> set, Function<Model, Integer> get, Model y){set.accept(this, get.apply(this) + get.apply(y));return this;}}

Map类型数据处理

public static void main (String[] args) {List<Map<String, Object>> datas = getDatas();streamMapSum(datas);}public static Map<Object, Map<String, Object>> streamMapSum (List<Map<String, Object>> datas) {return datas.stream().collect(Collectors.toMap(k -> k.get("name"), v -> {v.put("count", 1);return v;}, (x, y) -> {x.put("count", (int) x.get("count") + 1);x.put("aaa", (int) x.get("aaa") + (int) y.get("aaa"));x.put("bbb", (int) x.get("bbb") + (int) y.get("bbb"));x.put("ccc", (int) x.get("ccc") + (int) y.get("ccc"));return x;/*//使用ofMap重构return ofMap("name", x.get("name"), "count", (int) x.get("count") + 1, "aaa", add(x, y, "aaa"), "bbb", add(x, y, "bbb"), "ccc", add(x, y, "ccc"));*/}));}public static int add (Map<String, Object> x, Map<String, Object> y, String key) {return (int) x.get(key) + (int) y.get(key);}public static Map<String, Object> ofMap (Object... objs) {System.out.println("ofMap");Map<String, Object> map = new LinkedHashMap<>();for (int i = 0; i < objs.length; i = i + 2) {map.put(objs[i].toString(), objs[i + 1]);}return map;}public static List<Map<String, Object>> getDatas () {List<Map<String, Object>> list = new ArrayList<>();list.add(ofMap("name", "张三", "aaa", 3, "bbb", 5, "ccc", 6));list.add(ofMap("name", "张三", "aaa", 8, "bbb", 51, "ccc", 521));list.add(ofMap("name", "李四", "aaa", 9, "bbb", 53, "ccc", 23));return list;}

Java8 Stream 流 多字段求和、汇聚相关推荐

  1. java8 Stream流【华为3面】

    华为三面@java8 stream流操作面试题 前言:华为三面考了个很简单的基础编程,就是java8 Stream流操作,太久没写,也是没掌握好java基础直接搞得措手不及,stream两行代码的事情 ...

  2. Java8——Stream流

    Java8--Stream流 Stream是数据渠道,用于操作集合.数组等生成的元素序列. Stream操作的三个步骤: 创建Stream 中间操作 终止操作 一.获取stream的四种方式 1.通过 ...

  3. java8 stream流 将一个list转换成list

    java8 stream流 将一个对象集合转换成另一个对象集合 案例一: // 利用stream进行类型转化     List<String> stringList = new Array ...

  4. Java8 Stream 流 一些使用整理(持续更新)

    Java8 Stream 流 一些使用整理 双循环判断值 原始写法 Stream 普通写法 Stream filter + anyMatch写法 持续更新中 双循环判断值 原始写法 List<C ...

  5. 学习Java8 Stream流,让我们更加便捷的操纵集合

    1. 概述 本篇文章会简略的介绍一下 Lambda 表达式,然后开启我们的正题 Java8 Stream 流,希望观众老爷们多多支持,并在评论区批评指正! Java8 的 Stream 流使用的是函数 ...

  6. [编程] Java8 Stream(流式计算) 常见的一些用法汇总

    前提:以下基于 List<Student> 列表进行举例,大家实际使用进行举一反三即可.大同小异,Java8 的流式计算功能很强大,需要大家实际应用中逐渐挖掘更高级的用法. Student ...

  7. Java8 Stream流操作在用户系统中的妙用

    在做目前这个项目的时候,发现以前有一个筛选的需求,老程序员是这么做的,先请求Http服务器得到一长串json数据,大概用A4纸打了40多页那么多,然后将这些对象写入到sqlite数据库中,再用数据库查 ...

  8. java8 stream流操作集合交集,差集,并集,过滤,分组,去重,排序,聚合等

    测试对象 public class Person {private String name;private Integer age;private Integer weight;public Pers ...

  9. Java8 Stream流中的 collect() 方法,远比你想象中的强大

    Stream流 collect() 方法的使用介绍 //1. <R> R collect(Supplier<R> supplier,BiConsumer<R, ? sup ...

最新文章

  1. Springboot+Mybatis+Durid
  2. 初学__Python——Python数据类型之数字
  3. AUC、Precision、Recall、F-measure、Accuracy
  4. Codechef SEAARC Sereja and Arcs (分块)
  5. python 文件指针在文件末尾_python文件操作及seek偏移详解
  6. FIFO队列 ADT接口 链表实现
  7. python 读取特定字符之间数据_python 搜索每一行特定字符串之间的数据,求高人帮忙写人程序...
  8. 如何用T—SQL命令查询一个数据库中有哪些表?
  9. swoole 连接mysql_Swoole 优雅的实现 MySQL 连接池
  10. 几种java反编译软件的安装以及使用总结
  11. android 盒子刷机,DIY封装Android盒子刷机镜像
  12. Android混淆和加固详解
  13. 电脑小知识:电脑怎么查看ip地址?
  14. web网站http转成https
  15. 股票学习-量柱和k线-第一天
  16. 模拟电路设计(23)---模数和数模转换器概述
  17. Android开发——kotlin语法基础
  18. 给自己分一个 MAC地址--locally administered address
  19. 评价类(观点)题和理解类题目的辨析 区别一:审题干信息和题目要求。
  20. ​争夺00后社交,QQ、B站、快手谁能赢?

热门文章

  1. 分治法的计算时间、时间复杂度推导以及经典算法分析
  2. python3.7输出语句_python3测试工具开发快速入门教程7输入和输出
  3. docker的使用与进阶
  4. 曲奇云盘资源搜索引擎_你不知道的曲奇云盘“黑科技”
  5. MIT:谈如何做一名合格的研究生
  6. ARFoundation系列讲解 - 52 脱卡功能
  7. 竟有人靠抢茅台月入百万,脚本曝光,开源可用!
  8. 【Oracle问题】Oracle12c安装问题:INS-30014
  9. 数学建模番外篇7:优秀论文插图整理分析(2018年及之前)
  10. idea中maven插件爆红解决