代码块如下:

 List<AgentCheckoutStockDetail> agentCheckoutStockDetails = agentCheckoutStockDetailRepository.selectByExample(ws);Map<String, Long> countMap = agentCheckoutStockDetails.stream().collect(Collectors.groupingBy(o -> o.getDeliveryAgentId() + "_" + o.getProductSku() + "_" + o.getCheckoutTime(),Collectors.summingLong(AgentCheckoutStockDetail::getActualCount)));List<AgentCheckoutStockDetail> countRecords = countMap.keySet().stream().map(key -> {String[] arr = key.split("_");String deliveryAgentId1 = arr[0];String productSku = arr[1];String checkOutTime = arr[2];AgentCheckoutStockDetail obj = new AgentCheckoutStockDetail();obj.setDeliveryAgentId(deliveryAgentId1);obj.setProductSku(productSku);obj.setCheckoutTime(checkOutTime);obj.setActualCount(countMap.get(key).intValue());return obj;
}).collect(Collectors.toList());

1、分组核心思想

1.1、Collectors.groupingBy
如下代码:
Collectors.groupingBy(o -> o.getDeliveryAgentId() + "_" + o.getProductSku() + "_" + o.getCheckoutTime(), Collectors.summingLong(AgentCheckoutStockDetail::getActualCount))

首先明确的是 Collectors.groupingBy 是只能支持一个进行分组的参数

这里需要根据字符串的拼接来完成出多字段的分组处理

通过lambda表达式:o -> o.getDeliveryAgentId() + “-” + o.getProductSku() + “-” + o.getCheckoutTime()
这里可以看到原本只能接收一个参数的 groupby参数位置变成了多个字符串拼接

1.2、Collectors.summingLong(当然这里Long值可变)
Collectors.summingLong(AgentCheckoutStockDetail::getActualCount)

根据需要的字段进行求和,前提是根据前面的分组(如上图)

2、分组遍历(真正从分组中拿到数据)

 List<AgentCheckoutStockDetail> countRecords = countMap.keySet().stream().map(key -> {String[] arr = key.split("_");String deliveryAgentId1 = arr[0];String productSku = arr[1];String checkOutTime = arr[2];AgentCheckoutStockDetail obj = new AgentCheckoutStockDetail();obj.setDeliveryAgentId(deliveryAgentId1);obj.setProductSku(productSku);obj.setCheckoutTime(checkOutTime);obj.setActualCount(countMap.get(key).intValue());return obj;
}).collect(Collectors.toList());
2.1、拆分关键 key(group by)的那个字符串
    String[] arr = key.split("_");String deliveryAgentId1 = arr[0];String productSku = arr[1];String checkOutTime = arr[2];
2.2、重新创建对象,放入map
AgentCheckoutStockDetail obj = new AgentCheckoutStockDetail();obj.setDeliveryAgentId(deliveryAgentId1);obj.setProductSku(productSku);obj.setCheckoutTime(checkOutTime);obj.setActualCount(countMap.get(key).intValue());return obj;

这里注意 countMap.get(key).intValue() 根据key可以获取到对应的分组时的求和的值

后面如果需要再次转对象,自行转化即可

Java Stream 实现根据多字段分组求和相关推荐

  1. stream对多个字段分组_Java8 stream 中利用 groupingBy 进行多字段分组

    1.利用stream对数据进行分组并求和 public static void main(String[] args) { List items = Arrays.asList("apple ...

  2. stream对多个字段分组_java8 stream 如何按多字段分组,并对一个字段求和

    第一次回答,希望能帮到你 User类: class User { String name; String phone; String address; Long scope; public User( ...

  3. Stream——对集合某个字段数据求和

    文章目录 前言 定义数据接收类 定义测试数据 数据筛选 1.数据集合判空 1.1.Optional.isPresent() 1.2.orElse 替换 2.获取集合中类元属性信息并求和 你以为这样就结 ...

  4. java stream 8 常用的操作集合 求和 排序 过滤 拿出对象元素组成集合

    举个例子拿一个教师给学生开家长会Java实体 解释 stream 流操作集合建立在内存之上非常的快 以下列举 常用的操作方法 @Data public class OpenClass {private ...

  5. java 对List按照某个字段分组

    Map<Integer, List<Coupon>> resultList = couponList.stream().collect(Collectors.groupingB ...

  6. java 多字段分组_java8 stream统计、汇总、多字段分组、多个列汇总统计

    前言 本文将展示groupingBy收集器的多个示例,阅读本文需要先准备Java Stream和Java收集器Collector的知识. 一.GroupingBy收集器 Java8的Stream AP ...

  7. java stream 分组求和_Java stream List 求和、分组操作

    Java stream List 求和.分组操作 前言 项目中经常会使用Stream操作一些集合数据,今天记录一下我经常使用的Stream操作 求和操作public static void main( ...

  8. java stream实现分组BigDecimal求和,自定义分组求和

    前言 随着微服务的发展,越来越多的sql处理被放到java来处理,数据库经常会使用到对集合中的数据进行分组求和,分组运算等等. 那怎么样使用java的stream优雅的进行分组求和或运算呢? 一.准备 ...

  9. java steam 排序_java8 stream自定义分组求和并排序的实现

    本文主要介绍了java8 stream自定义分组求和并排序的实现,分享给大家,具体如下: public static void main(String[] args) { List list = ne ...

  10. Java Stream Collectors.groupingBy()实现分组(单字段分组,多字段分组)

    1 User实体类 public class User {private Long userId;/*** 用户名(登录)*/private String username;/*** 年龄*/priv ...

最新文章

  1. 图像处理工具包ImagXpress的多页TIFF编辑API的使用(1)
  2. PUE值测算标准实践问题探讨
  3. qt 中给 按纽(button) 填充图片的方法
  4. LeetCode OJ - Convert Sorted List to Binary Search Tree
  5. React Native升级方法——升级到最新版本0.59
  6. Aho-Corasick Automaton · AC自动机
  7. elasticsearch报错:exceeds the [index.highlight.max_analyzed_offset] limit [1000000]
  8. 洛谷P1125 笨小猴 题解
  9. Android腾讯广告联盟接入-----开屏广告
  10. [RCtank]在xcode的iOS虚拟机中对BLE(蓝牙4.0)进行调试
  11. 2020 年中科院计算所“计算未来”全国大学生暑期班 网络数据科学与技术重点实验室 机试试题
  12. php考核奖金制度,奖金制度与绩效考核
  13. 2017年华为实习面试心得
  14. linux下mv命令参数详解,linux下的mv命令使用详解
  15. Mac Os微信多开小助手安装教程
  16. Windows循环渐进-Ping程序实现代码
  17. IMF国际货币基金组织
  18. 能够语义化的编写html文档,HTML语义化 - 写给未来的自己 - OSCHINA - 中文开源技术交流社区...
  19. 谁是三鹿奶粉事件的真凶
  20. System.Web.Services.Protocols.SoapException: 服务器无法处理请求

热门文章

  1. android 参数签名 存放,SignatureView 一个在Android上的电子签名板,能保存所签名的图片...
  2. 360浏览器cookie的导出
  3. Python打造qq音乐歌曲下载器
  4. CMPP3.0协议(移动)
  5. springboot利用拦截器和过滤器获取post请求参数
  6. Vue之解析PSD文件(文字)
  7. Keil uVision5 MDK-ARM 程序使用—————中文图解
  8. 伟豪带你逛郑州商业技师学院⑨:电气工程系
  9. ps,pr,ae安装插件出现“无法加载扩展,因为它未正确签署”解决办法
  10. 模糊综合评价法——解决评价指标模糊、难以量化的问题