当前位置: 首页 > news >正文

Java使用stream进行分组汇总失效问题

背景

在当前项目的开发任务中需要定制财务报表导出功能,格式比较特殊使用了VM。在汇总数据的过程中使用了stream.collect 进行分组汇总。在测试的过程中发现分组失败,最终原因是对象的对比方式问题,collect是根据对象对比的所以需要重写equals。

问题代码

   private List<SettlementSheet> sumStkPosition(List<SettlementSheet> dataList){List<SettlementSheet> resList = new ArrayList<>();Map<KeyGroup, List<SettlementSheet>> groupedData = dataList.stream().collect(Collectors.groupingBy(obj -> new KeyGroup(obj.getSEATID_(),obj.getPZ_(),obj.getHOLDERACC_(),obj.getSTKCODE_(),obj.getHEDGINGFLAG_())));for (Map.Entry<KeyGroup, List<SettlementSheet>> entry : groupedData.entrySet()) {KeyGroup key = entry.getKey();List<SettlementSheet> group = entry.getValue();double sumBstkamt = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getBSTKAMT_().toString())).sum();double sumBcap = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getBSTKAMT_().toString()) *Double.parseDouble(obj.getBCJJJ_().toString())).sum();double avgBcjjj = sumBstkamt == 0 ? 0 : sumBcap / sumBstkamt;double sumSstkamt = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getSSTKAMT_().toString())).sum();double sumScap = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getSSTKAMT_().toString()) *Double.parseDouble(obj.getSCJJJ_().toString())).sum();double avgScjjj = sumSstkamt == 0 ? 0 : sumScap / sumSstkamt;double dzrjs = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getZRJS_()==null?"0":obj.getZRJS_().toString())).max().orElse(0.0);double djrjs = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getJRJS_()==null?"0":obj.getJRJS_().toString())).max().orElse(0.0);double ddprofit = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getDPROFIT_().toString())).sum();double dmargin = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getMARGIN_().toString())).sum();double dstkvalueOptd = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getSTKVALUEOPTD_().toString())).sum();double dstkvalueOptk = group.stream().mapToDouble(obj -> Double.parseDouble(obj.getSTKVALUEOPTK_().toString())).sum();SettlementSheet rowData = new SettlementSheet();rowData.setSEATID_(key.getSEATID_());rowData.setPZ_(key.getPREFIX_());rowData.setHOLDERACC_(key.getHOLDERACC_());rowData.setSTKCODE_(key.getSTKCODE_());rowData.setHEDGINGFLAG_(key.getHEDGINGFLAG_());rowData.setBSTKAMT_(BigDecimal.valueOf(sumBstkamt));rowData.setBCJJJ_(BigDecimal.valueOf(avgBcjjj).setScale(2, RoundingMode.HALF_UP));rowData.setSSTKAMT_(BigDecimal.valueOf(sumSstkamt));rowData.setSCJJJ_(BigDecimal.valueOf(avgScjjj).setScale(2, RoundingMode.HALF_UP));rowData.setZRJS_(BigDecimal.valueOf(dzrjs));rowData.setJRJS_(BigDecimal.valueOf(djrjs));rowData.setDPROFIT_(BigDecimal.valueOf(ddprofit));rowData.setMARGIN_(BigDecimal.valueOf(dmargin).setScale(2, RoundingMode.HALF_UP));rowData.setSTKVALUEOPTD_(BigDecimal.valueOf(dstkvalueOptd));rowData.setSTKVALUEOPTK_(BigDecimal.valueOf(dstkvalueOptk));resList.add(rowData);}return resList;}
    private class KeyGroup{private String SEATID_;public KeyGroup(String SEATID_, String PREFIX_, String HOLDERACC_, String STKCODE_, String HEDGINGFLAG_) {this.SEATID_ = SEATID_;this.PREFIX_ = PREFIX_;this.HOLDERACC_ = HOLDERACC_;this.STKCODE_ = STKCODE_;this.HEDGINGFLAG_ = HEDGINGFLAG_;}private String PREFIX_;private String HOLDERACC_;private String STKCODE_;private String HEDGINGFLAG_;public String getSEATID_() {return SEATID_;}public void setSEATID_(String SEATID_) {this.SEATID_ = SEATID_;}public String getPREFIX_() {return PREFIX_;}public void setPREFIX_(String PREFIX_) {this.PREFIX_ = PREFIX_;}public String getHOLDERACC_() {return HOLDERACC_;}public void setHOLDERACC_(String HOLDERACC_) {this.HOLDERACC_ = HOLDERACC_;}public String getSTKCODE_() {return STKCODE_;}public void setSTKCODE_(String STKCODE_) {this.STKCODE_ = STKCODE_;}public String getHEDGINGFLAG_() {return HEDGINGFLAG_;}public void setHEDGINGFLAG_(String HEDGINGFLAG_) {this.HEDGINGFLAG_ = HEDGINGFLAG_;}}

解决方法

重写equals方法

        @Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}KeyGroup mkPriceKey = (KeyGroup) obj;return Objects.equals(this.SEATID_, mkPriceKey.SEATID_) &&Objects.equals(this.PREFIX_, mkPriceKey.PREFIX_) &&Objects.equals(this.HOLDERACC_, mkPriceKey.HOLDERACC_) &&Objects.equals(this.STKCODE_, mkPriceKey.STKCODE_) &&Objects.equals(this.HEDGINGFLAG_, mkPriceKey.HEDGINGFLAG_);}

修正后代码

    private class KeyGroup{private String SEATID_;public KeyGroup(String SEATID_, String PREFIX_, String HOLDERACC_, String STKCODE_, String HEDGINGFLAG_) {this.SEATID_ = SEATID_;this.PREFIX_ = PREFIX_;this.HOLDERACC_ = HOLDERACC_;this.STKCODE_ = STKCODE_;this.HEDGINGFLAG_ = HEDGINGFLAG_;}private String PREFIX_;private String HOLDERACC_;private String STKCODE_;private String HEDGINGFLAG_;public String getSEATID_() {return SEATID_;}public void setSEATID_(String SEATID_) {this.SEATID_ = SEATID_;}public String getPREFIX_() {return PREFIX_;}public void setPREFIX_(String PREFIX_) {this.PREFIX_ = PREFIX_;}public String getHOLDERACC_() {return HOLDERACC_;}public void setHOLDERACC_(String HOLDERACC_) {this.HOLDERACC_ = HOLDERACC_;}public String getSTKCODE_() {return STKCODE_;}public void setSTKCODE_(String STKCODE_) {this.STKCODE_ = STKCODE_;}public String getHEDGINGFLAG_() {return HEDGINGFLAG_;}public void setHEDGINGFLAG_(String HEDGINGFLAG_) {this.HEDGINGFLAG_ = HEDGINGFLAG_;}@Overridepublic int hashCode() {return Objects.hash(SEATID_, PREFIX_, HOLDERACC_, STKCODE_, HEDGINGFLAG_);}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}KeyGroup mkPriceKey = (KeyGroup) obj;return Objects.equals(this.SEATID_, mkPriceKey.SEATID_) &&Objects.equals(this.PREFIX_, mkPriceKey.PREFIX_) &&Objects.equals(this.HOLDERACC_, mkPriceKey.HOLDERACC_) &&Objects.equals(this.STKCODE_, mkPriceKey.STKCODE_) &&Objects.equals(this.HEDGINGFLAG_, mkPriceKey.HEDGINGFLAG_);}}

总结

应该有更好的实现方式,java使用的不是很熟练。之后有新思路再来更新。

http://www.lryc.cn/news/487700.html

相关文章:

  • VMWare虚拟机安装华为欧拉系统
  • 阿里云轻量应用服务器可以用在哪些场景呢
  • OrangePi 5plus yolov5 部署全过程
  • Rust中::和.的区别
  • 集群聊天服务器(7)数据模块
  • VS Code 更改背景颜色
  • OpenAI 助力数据分析中的模式识别与趋势预测
  • IDM扩展添加到Edge浏览器
  • 【SpringBoot】26 实体映射工具(MapStruct)
  • 分层架构 IM 系统之架构演进
  • 基于YOLOv8深度学习的医学影像阿尔兹海默症检测诊断系统研究与实现(PyQt5界面+数据集+训练代码)
  • 【支持向量机(SVM)】:相关概念及API使用
  • Android kotlin之配置kapt编译器插件
  • 时序数据库TDEngine
  • jd-easyflow中inclusive的用法
  • sqlmap图形化安装使用(附文件)
  • 从二维到一维:动态规划矩阵问题的优化之道
  • 计算机视觉(CV):让机器看懂世界
  • 记录下,用油猴Tampermonkey监听所有请求,绕过seesion
  • 服务器产品
  • pyhton django web集群基于linux定时任务
  • 探索 Python 字典的奥秘:Future 对象为何能成为字典的键?
  • 多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系
  • Spark 中 RDD checkpoint 是通过启动两个独立的 Job 完成的。
  • 如何下载TikTok视频没有水印
  • 天童美语:提升孩子的自信心的方法
  • 【网络编程】字节序:大端序和小端序
  • 视频融合×室内定位×数字孪生
  • RK3568平台开发系列讲解(platform虚拟总线驱动篇)注册 platform 驱动
  • Jmeter进阶篇(26)杀掉Tomcat的几种方法