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使用的不是很熟练。之后有新思路再来更新。
相关文章:
Java使用stream进行分组汇总失效问题
背景 在当前项目的开发任务中需要定制财务报表导出功能,格式比较特殊使用了VM。在汇总数据的过程中使用了stream.collect 进行分组汇总。在测试的过程中发现分组失败,最终原因是对象的对比方式问题,collect是根据对象对比的所以需要重写equa…...
 
VMWare虚拟机安装华为欧拉系统
记录一下安装步骤: 1.在vmware中创建一个新的虚拟机,步骤和创建centos差不多 2.启动系统 具体的看下图: 启动虚拟机 耐心等待 等待进度条走完重启系统就完成了...
 
阿里云轻量应用服务器可以用在哪些场景呢
在数字化转型的浪潮中,中小企业面临着如何快速、高效地上云的挑战。阿里云轻量应用服务器(SWAS)作为一款专为中小企业设计的云服务产品,提供了简单易用、经济实惠的解决方案,助力企业轻松实现云端部署,赋能…...
 
OrangePi 5plus yolov5 部署全过程
准备工作 一、下载用户手册 下载-Orange Pi官网-香橙派(Orange Pi)开发板,开源硬件,开源软件,开源芯片,电脑键盘 里面有详细的镜像烧录教程和桌面使用等 二、镜像下载 准备一张TF卡(32G以上),插入电脑,…...
Rust中::和.的区别
在 Rust 中,:: 和 . 是两种常用的操作符,它们的作用和语法用途不同。以下是详细的对比和解释: 1. ::(双冒号) :: 是 路径操作符,主要用于访问模块、结构体、枚举、函数、常量等的命名空间中的成员。 主要…...
 
集群聊天服务器(7)数据模块
目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库,因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql,想存redis的话,就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…...
 
VS Code 更改背景颜色
我们的 VS code 默认是 黑色,这个颜色在有光的情况下,个人感觉反光比较严重。 所以换成白色了。 步骤: 选择 File -> Preferences -> Settings Workbench -> Appearance -> Color Theme -> 选择喜欢的颜色 选择后会变为你选…...
 
OpenAI 助力数据分析中的模式识别与趋势预测
数据分析师的日常工作中,发现数据中的隐藏模式和预测未来趋势是非常重要的一环。借助 OpenAI 的强大语言模型(如 GPT-4),我们可以轻松完成这些任务,无需深厚的编程基础,也能快速上手。 在本文中࿰…...
 
IDM扩展添加到Edge浏览器
IDM扩展添加到Edge浏览器 一般情况下,当安装IDM软件后,该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上,但在某些情况下,需要我们手动安装,以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…...
 
【SpringBoot】26 实体映射工具(MapStruct)
Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护,通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中,推荐分层如下图所示: 每层都有对应的领域模型,即不同类型的 Bean。 DO&…...
 
分层架构 IM 系统之架构演进
在电商业务日活几百万的情况下,IM 系统采用分层架构方式,如下图。 分层架构的 IM 系统,整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】,我们在上篇文章(分层架构 IM 系…...
 
基于YOLOv8深度学习的医学影像阿尔兹海默症检测诊断系统研究与实现(PyQt5界面+数据集+训练代码)
阿尔茨海默症(Alzheimer’s disease)是一种常见的神经退行性疾病,主要表现为记忆丧失、认知能力下降以及行为和人格改变。随着全球老龄化问题的加剧,阿尔茨海默症的发病率也在逐年上升,给患者及其家庭带来了巨大的经济…...
 
【支持向量机(SVM)】:相关概念及API使用
文章目录 1 SVM相关概念1.1 SVM引入1.1.1 SVM思想1.1.2 SVM分类1.1.3 线性可分、线性和非线性的区分 1.2 SVM概念1.3 支持向量概念1.4 软间隔和硬间隔1.5 惩罚系数C1.6 核函数 2 SVM API使用2.1 LinearSVC API 说明2.2 鸢尾花数据集案例2.3 惩罚参数C的影响 1 SVM相关概念 1.1…...
 
Android kotlin之配置kapt编译器插件
配置项目目录下的gradle/libs.versions.toml文件,添加kapt配置项: 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…...
时序数据库TDEngine
TDengine 是一款开源、高性能、云原生的时序数据库(Time Series Database, TSDB), 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计。同时它还带有内建的缓存、流式计算、数据订阅等系统功能,能大幅减少系统设计的复杂度&…...
jd-easyflow中inclusive的用法
在jd-easyflow中,inclusive通常与流程中的条件分支(conditions)配置相关,用于控制多个条件分支的执行逻辑。当conditionType设置为inclusive时,表示多个条件分支中的所有条件都会被评估,而不是像exclusive那…...
 
sqlmap图形化安装使用(附文件)
1.需要python环境,我这里就不教如何安装python环境了。 2.下载压缩包并且解压 3. 凭自己喜好选择大窗口小窗口 4.进入图形化界面后,1.输入url地址。2.选择要执行的操作。3.构造命令语句 5.点击一把梭,然后就可以发现出结果了 6. 对于喜欢自己…...
 
从二维到一维:动态规划矩阵问题的优化之道
动态规划中的矩阵问题是非常经典的应用场景,比如最小路径和问题。这类问题很自然地可以想到使用二维 dp 数组来求解。 我们定义: dp[i][j] 表示从矩阵的第 i行第 j列到右下角的最小路径和。 基本解法 求解过程从右下角开始,向左上角遍历&am…...
计算机视觉(CV):让机器看懂世界
引言 计算机视觉(Computer Vision, CV)是人工智能的重要领域,致力于让机器能够“看懂”世界。CV技术广泛应用于自动驾驶、医疗影像、安防监控和娱乐领域,正在改变我们的生活方式。 本文将从基本概念、技术方法、应用场景和发展方向…...
 
记录下,用油猴Tampermonkey监听所有请求,绕过seesion
油猴Tampermonkey监听所有请求,绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口,这个接口的页面入口被隐藏掉了,不能通过页面调用,幸好之前有想过逆向破解通过账号密码模拟登录后拿到token,请求该…...
 
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
 
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
 
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
 
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
 
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
 
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
 
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
 
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
