JavaStream实现根据多字段分组求和
代码块如下:
List<AgentCheckoutStockDetail> agentCheckoutStockDetails = agentCheckoutStockDetailRepository.selectByExample(ws);
Map<String,Long> countMap = agentCheckoutStockDetails.stream()
.upingBy(o -> o.getDeliveryAgentId()+"_"+ o.getProductSku()+"_"+ o.getCheckoutTime(),Collectors.summingLong(AgentChe ckoutStockDetail::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.(key).intValue());
return obj;
}).List());
1、分组核⼼思想
1.1、upingBy
如下代码:
⾸先明确的是 upingBy 是只能⽀持⼀个进⾏分组的参数
这⾥需要根据字符串的拼接来完成出多字段的分组处理
通过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];
java streamString checkOutTime = arr[2];
AgentCheckoutStockDetail obj = new AgentCheckoutStockDetail();
obj.setDeliveryAgentId(deliveryAgentId1);
obj.setProductSku(productSku);
obj.setCheckoutTime(checkOutTime);
obj.(key).intValue());
return obj;
}).List());
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.(key).intValue());
return obj;
这⾥注意 (key).intValue() 根据key可以获取到对应的分组时的求和的值
后⾯如果需要再次转对象,⾃⾏转化即可

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。