当前位置: 首页 > 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使用的不是很熟练。之后有新思路再来更新。

相关文章:

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

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

VMWare虚拟机安装华为欧拉系统

记录一下安装步骤&#xff1a; 1.在vmware中创建一个新的虚拟机&#xff0c;步骤和创建centos差不多 2.启动系统 具体的看下图&#xff1a; 启动虚拟机 耐心等待 等待进度条走完重启系统就完成了...

阿里云轻量应用服务器可以用在哪些场景呢

在数字化转型的浪潮中&#xff0c;中小企业面临着如何快速、高效地上云的挑战。阿里云轻量应用服务器&#xff08;SWAS&#xff09;作为一款专为中小企业设计的云服务产品&#xff0c;提供了简单易用、经济实惠的解决方案&#xff0c;助力企业轻松实现云端部署&#xff0c;赋能…...

OrangePi 5plus yolov5 部署全过程

准备工作 一、下载用户手册 下载-Orange Pi官网-香橙派&#xff08;Orange Pi&#xff09;开发板,开源硬件,开源软件,开源芯片,电脑键盘 里面有详细的镜像烧录教程和桌面使用等 二、镜像下载 准备一张TF卡&#xff08;32G以上&#xff09;&#xff0c;插入电脑&#xff0c…...

Rust中::和.的区别

在 Rust 中&#xff0c;:: 和 . 是两种常用的操作符&#xff0c;它们的作用和语法用途不同。以下是详细的对比和解释&#xff1a; 1. ::&#xff08;双冒号&#xff09; :: 是 路径操作符&#xff0c;主要用于访问模块、结构体、枚举、函数、常量等的命名空间中的成员。 主要…...

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…...

VS Code 更改背景颜色

我们的 VS code 默认是 黑色&#xff0c;这个颜色在有光的情况下&#xff0c;个人感觉反光比较严重。 所以换成白色了。 步骤&#xff1a; 选择 File -> Preferences -> Settings Workbench -> Appearance -> Color Theme -> 选择喜欢的颜色 选择后会变为你选…...

OpenAI 助力数据分析中的模式识别与趋势预测

数据分析师的日常工作中&#xff0c;发现数据中的隐藏模式和预测未来趋势是非常重要的一环。借助 OpenAI 的强大语言模型&#xff08;如 GPT-4&#xff09;&#xff0c;我们可以轻松完成这些任务&#xff0c;无需深厚的编程基础&#xff0c;也能快速上手。 在本文中&#xff0…...

IDM扩展添加到Edge浏览器

IDM扩展添加到Edge浏览器 一般情况下&#xff0c;当安装IDM软件后&#xff0c;该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上&#xff0c;但在某些情况下&#xff0c;需要我们手动安装&#xff0c;以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…...

【SpringBoot】26 实体映射工具(MapStruct)

Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护&#xff0c;通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中&#xff0c;推荐分层如下图所示&#xff1a; 每层都有对应的领域模型&#xff0c;即不同类型的 Bean。 DO&…...

分层架构 IM 系统之架构演进

在电商业务日活几百万的情况下&#xff0c;IM 系统采用分层架构方式&#xff0c;如下图。 分层架构的 IM 系统&#xff0c;整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】&#xff0c;我们在上篇文章&#xff08;分层架构 IM 系…...

基于YOLOv8深度学习的医学影像阿尔兹海默症检测诊断系统研究与实现(PyQt5界面+数据集+训练代码)

阿尔茨海默症&#xff08;Alzheimer’s disease&#xff09;是一种常见的神经退行性疾病&#xff0c;主要表现为记忆丧失、认知能力下降以及行为和人格改变。随着全球老龄化问题的加剧&#xff0c;阿尔茨海默症的发病率也在逐年上升&#xff0c;给患者及其家庭带来了巨大的经济…...

【支持向量机(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文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…...

时序数据库TDEngine

TDengine 是一款开源、高性能、云原生的时序数据库&#xff08;Time Series Database, TSDB&#xff09;, 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计。同时它还带有内建的缓存、流式计算、数据订阅等系统功能&#xff0c;能大幅减少系统设计的复杂度&…...

jd-easyflow中inclusive的用法

在jd-easyflow中&#xff0c;inclusive通常与流程中的条件分支&#xff08;conditions&#xff09;配置相关&#xff0c;用于控制多个条件分支的执行逻辑。当conditionType设置为inclusive时&#xff0c;表示多个条件分支中的所有条件都会被评估&#xff0c;而不是像exclusive那…...

sqlmap图形化安装使用(附文件)

1.需要python环境&#xff0c;我这里就不教如何安装python环境了。 2.下载压缩包并且解压 3. 凭自己喜好选择大窗口小窗口 4.进入图形化界面后&#xff0c;1.输入url地址。2.选择要执行的操作。3.构造命令语句 5.点击一把梭&#xff0c;然后就可以发现出结果了 6. 对于喜欢自己…...

从二维到一维:动态规划矩阵问题的优化之道

动态规划中的矩阵问题是非常经典的应用场景&#xff0c;比如最小路径和问题。这类问题很自然地可以想到使用二维 dp 数组来求解。 我们定义&#xff1a; dp[i][j] 表示从矩阵的第 i行第 j列到右下角的最小路径和。 基本解法 求解过程从右下角开始&#xff0c;向左上角遍历&am…...

计算机视觉(CV):让机器看懂世界

引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;是人工智能的重要领域&#xff0c;致力于让机器能够“看懂”世界。CV技术广泛应用于自动驾驶、医疗影像、安防监控和娱乐领域&#xff0c;正在改变我们的生活方式。 本文将从基本概念、技术方法、应用场景和发展方向…...

记录下,用油猴Tampermonkey监听所有请求,绕过seesion

油猴Tampermonkey监听所有请求&#xff0c;绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口&#xff0c;这个接口的页面入口被隐藏掉了&#xff0c;不能通过页面调用&#xff0c;幸好之前有想过逆向破解通过账号密码模拟登录后拿到token&#xff0c;请求该…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...