关于在集合中对象比较属性值的问题
关于在集合中对象比较属性值的问题
- 1 问题说明
- 2 问题排查
- 3 总结及伪代码
楼主在最近遇到一个场景,项目中有一个校验。 需要将数据库查询的集合对象与前端传递的集合对象进行比较,看数据是否被修改。
1 问题说明
基于上面项目需求,项目为较老的传统项目,没使用Lombok插件(划重点),实体类和DTO,BO对象都是原有get、set方法等等。项目之前运行正常,且没有任何问题。接到新需求,需要多添加某些字段。
再一顿CRUD的基础操作之后,代码加上去,实体类对应的页面增删改查都没有问题。于是极度自信,提交代码。(O(∩_∩)O)
在代码中上述校验处,突然报错,直接给我整懵逼。
2 问题排查
本着哪里有问题,就解决哪里的思维。
-
首先,怀疑是不是前端传值有误差(
前端问题),在集合比较处添加上相关日志,抓取日志,分析对比数据后,发现数据没有问题,无论是前端传参,还是后端数据库查询。 -
问题已经很明显了,加的代码有问题。(
不可能,绝对不可能) ,虽然吧,但是可以确认就是自己加出问题了。然后看了下,集合比较的方法是collections.subtract()。这个方法常用来比较两个集合的差值,而且一般用在基本的数据类型比较,如字符串集合,数字集合等等。再对象集合比较,用的还是较少。
已经知道了是这个方法比较的问题,查看了一下实体类和DTO对象新增字段,set、get方法也都给写了,包括toString方法也重写了。看了两个对象一下子又没思路了,突然想到比较两个对象值,需要重写equals和hashcode方法。(掐自己一下)检查了一下实体类和DTO对象,因实体类不做比较,故没加equals和hashcode方法。而DTO对象因用来做了比较,所以都重写了这两个方法。看了一下DTO对象中,仅仅只加了属性和get、set方法以及toString方法。 按照思路,在equals和hashcode方法中加上新增字段,启动项目测试,成功了!(撒花)
3 总结及伪代码
思考了一下,问题的出现。
因平时接触新项目,都是用lombok插件,对于对象的字段的删减,平时只需要注意对象本身以及xml文件中的sql拼写,对于对象基本的toString,equals,hashcode等方法关注不多。(基本忽视)在老项目中,没使用lombok插件,没人来帮忙写这些基础的对象方法,所以在一个简单的增减字段的需求时,需要花一些时间来关注对象本身的方法。这也正说明lombok插件也是蛮方便,减少了这类小问题。
伪代码
原有对象
public class UserDTO {private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "UserDTO{" +"id='" + id + '\'' +", name='" + name + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserDTO userDTO = (UserDTO) o;return Objects.equals(id, userDTO.id) &&Objects.equals(name, userDTO.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}
}
添加新字段
public class UserDTO {private String id;private String name;// 新加字段手机号private String phone;public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "UserDTO{" +"id='" + id + '\'' +", name='" + name + '\'' +", phone='" + phone + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserDTO userDTO = (UserDTO) o;return Objects.equals(id, userDTO.id) &&Objects.equals(name, userDTO.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}
}
比较逻辑代码
// 前端传参数
List<UserDTO> reqList = new ArrayList();
// 数据库查询
List<UserDTO> respList = new ArrayList();
// 两个集合差集
List<UserDTO> resultList = CollectionUtils.subtract(reqList,respList)
// 判断集合中数据是否改变
if(CollectionUtils.isNotEmpty(resultList)){// 前端数据中,传了手机号,一直识别不出来,添加名称则可以识别出来,在DTO对象中equals方法中添加手机号即可
}
最后状态
public class UserDTO {private String id;private String name;private String phone;// 省略set/get方法@Overridepublic String toString() {return "UserDTO{" +"id='" + id + '\'' +", name='" + name + '\'' +", phone='" + phone + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserDTO userDTO = (UserDTO) o;return Objects.equals(id, userDTO.id) &&Objects.equals(name, userDTO.name) &&Objects.equals(phone, userDTO.phone);}@Overridepublic int hashCode() {return Objects.hash(id, name, phone);}
}相关文章:
关于在集合中对象比较属性值的问题
关于在集合中对象比较属性值的问题1 问题说明2 问题排查3 总结及伪代码楼主在最近遇到一个场景,项目中有一个校验。 需要将数据库查询的集合对象与前端传递的集合对象进行比较,看数据是否被修改。 1 问题说明 基于上面项目需求,项目为较老的…...
java微信小程序旅游管理系统
本旅游服务软件,主要实现了管理员后端:首页、个人中心、旅游攻略管理、旅游资讯管理、景点信息管理、门票预定管理、用户管理、酒店信息管理、酒店预定管理、推荐路线管理、论坛管理、系统管理,用户前端:首页、景点信息、酒店信息、论坛中心、我的等。总…...
2023年要跟踪的11个销售管理关键指标
销售管理关键指标有:营销合格线索数量(MQL)、MQL 到 SQL 的转换率、商机赢单率、获客成本、总销售额、客户终身价值(LTV)、LTV 与 CAC 比率、赢单周期、每客户平均销售额(平均客单价)、每销售人…...
MongoDB--》基本常用命令使用
目录 数据库操作命令 选择和创建数据库 数据库的删除 集合操作命令 集合的显示创建 集合的隐式创建 集合的删除 文档基本的CRUD(增删改查) 文档的插入 文档的基本查询 文档的更新 删除文档 数据库操作命令 数据库常用的操作命令如下&#x…...
js浮点数四则运算精度丢失以及toFixed()精度丢失解决方法
js浮点数四则运算精度丢失以及tofixed精度丢失解决方法一、js浮点数计算精度丢失的一些例子1、四则运算精度丢失:2、toFixed() 四舍五入精度丢失:二、浮点数计算精度丢失的原因三、解决办法1、使用 big.js(如果有大量连续的计算推荐使用&…...
高姿态下的面部表情识别系统
效果展示: python表情、性别识别面部表情识别 (FER) 在计算机安全、神经科学、心理学和工程学方面有大量应用。由于其非侵入性,它被认为是打击犯罪的有用技术。然而,FER 面临着几个挑战,其中最严重的是它在严重的头部姿势下的预测…...
English Learning - Day59 作业打卡 2023.2.13 周一
English Learning - Day59 作业打卡 2023.2.13 周一引言1. 我有一些急事要处理。2. 这个孩子无忧无虑。3. 那个骑在白马上的姑娘是我姐姐。4. 对方正在给我们公司施加压力迫使我们降价。5. 我的医生告诉我要少吃垃圾食品。6. 我从来不熬夜。7.我早就想跟你聊一聊了。8.我一定不…...
图机器学习
图机器学习1、图机器学习导论1.1图神经网络与普通神经网络的异同2、图的基本表示和特征工程2.1 图的基本表示2.1.1 图的本体设计2.1.2 图的种类2.1.3节点连接数(度)2.1.4图的基本表示(邻接矩阵)节点数量少使用2.1.5图的基本表示&a…...
ArcGIS中ArcMap创建渔网Create Fishnet:生成指定大小的格网矢量文件
本文介绍在ArcMap软件中,通过“Create Fishnet”工具创建渔网,从而获得指定大小的矢量格网数据的方法。 首先,我们在创建渔网前,需要指定渔网覆盖的范围。这里我们就以四川省为例,在这一范围内创建渔网;其中…...
TensorRT中的自定义层
TensorRT中的自定义层 文章目录TensorRT中的自定义层9.1. Adding Custom Layers Using The C API9.1.1. Example: Adding A Custom Layer With Dynamic Shape Support Using C重要提示:覆盖检查索引小于pos的连接的格式/类型,但绝不能检查索引大于pos的连…...
部署智能合约到公链
🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…...
Windows server——部署DNS服务(3)
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.管理DNS服务 1.子域 案例 2. 委派 案例 1)添加主机记录 …...
9. QML_OpenGL--2. 在QQuick中搭建加载OpenGL框架
1. 说明: OPenGL一般在 QtWidget 中使用,但目前使用 QML 做界面开发是一种趋势,同时在QML中使用OPenGL进行渲染也是十分必要,文章简单介绍如何在QML中使用 OPenGL,搭建了一种基本的框架。整体思路和在 QtWidget 中类似…...
亚马逊云科技携手滴普科技,打造数据智能新标杆
随着企业数字化转型的不断深入,数据对于业务的价值和重要性也逐渐凸显。越来越多企业意识到,只有不断提升底层数据基础平台的性能和能力,才能构建数据驱动的业务,增强企业核心竞争力。作为湖仓一体数据智能基础软件独角兽企业&…...
CGO 跨平台静态编译
什么是跨平台编译? 跨平台编译:即交叉编译,是在一个平台上生成另一个平台上的可执行文件。所谓平台,实际上包含两个概念:体系架构(Architecture)、操作系统 (Operating System)。同一个体系架构可以运行不同…...
股票买卖接口怎么来的?
现在股票买卖接口主要是在线上研发,有专业的开发团队进行源码开发和完善,但是,常常会在开发过程中出现问题,也就是遇到一些特殊的情况需要及时处理,那么股票买卖接口怎么开发实现出来的?一、股票买卖接口开…...
【Python学习笔记】29.Python3 面向对象
前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 Python3 面向对象 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面…...
MySQL 索引
索引 索引是一种用于快速查询和检查数据的数据结构,其本质可以看成是一种排好序的数据结构。理解:索引的作用就相当于书的目录📚,可以根据目录快速定位到想要查看的位置。常见的索引结构:B Tree、B Tree、Hash、红黑树…...
学会使用LoadRunner录制脚本
1.LoadRunner安装 https://blog.csdn.net/weixin_48584088/article/details/129012469 2.Loadrunner的基本概念 LoadRunner是一种适用于许多软件体系架构的自动负载测试工具,从用户关注的响应时间、吞吐量, 并发用户和性能计数器等方面来衡量系统的性…...
产品经理必看的高效产品文档撰写指南
对于企业来说,如何推广自己的产品是一个非常重要的话题,而其中必要的就是创建企业产品宣传册,这对于产品宣传非常重要,尤其是一些大公司,非常重视这种产品展示方式。因为它可以更完整地展现产品,撰写一份合…...
如何使用 Gherkin 解析器:Behat 测试的终极指南
如何使用 Gherkin 解析器:Behat 测试的终极指南 【免费下载链接】Gherkin Gherkin parser, written in PHP for Behat project 项目地址: https://gitcode.com/gh_mirrors/gh/Gherkin Gherkin 解析器是 Behat 项目的核心组件,它提供了一种简单而强…...
Pixel6一键Root神器Apatch实测:比Magisk更隐蔽的终极方案(附详细刷机步骤)
Pixel6深度Root方案对比:Apatch实战评测与完整操作指南 在Android设备定制化领域,Root权限获取始终是技术爱好者关注的焦点。对于Pixel6用户而言,如何在保持系统稳定性的同时实现深度控制,同时规避各类检测机制,成为当…...
Z-Image-Turbo精彩案例分享:10个爆款Prompt生成的超写实艺术作品
Z-Image-Turbo精彩案例分享:10个爆款Prompt生成的超写实艺术作品 1. 引言:当文字遇见艺术的神奇时刻 你有没有试过这样的体验:脑海中浮现出一幅绝美的画面,却苦于无法用画笔将它呈现出来?或者想要为你的项目制作一张…...
论文省心了!10个降AIGC工具测评:开源免费+降AI率全攻略
在学术写作日益依赖AI工具的今天,论文的AIGC率问题成为许多学生和研究者关注的焦点。如何在保持原文语义通顺的前提下,有效降低AI痕迹和查重率,成为一项重要的技能。而市面上涌现的众多降AIGC工具,正是为了解决这一痛点而生。这些…...
cv_resnet101_face-detection_cvpr22papermogface部署教程:NVIDIA Triton推理服务器集成方案
cv_resnet101_face-detection_cvpr22papermogface部署教程:NVIDIA Triton推理服务器集成方案 1. 引言 人脸检测是计算机视觉领域最基础也最核心的任务之一。无论是安防监控、手机解锁,还是社交媒体的美颜滤镜,背后都离不开一个快速、准确的…...
公开课 | 区块链安全(第三讲)
上课时间:本周五(3.20号)晚 20:00-21:00讲师介绍:Bosco,MS08067核心成员,香港科技大学博士,某安全公司前区块链高级安全研究员。第1/2讲回放:https://www.bilibili.com/video/BV1nWw…...
CVTE社招面试经验:Linux驱动与Android底层开发岗
该项目文档内容为CVTE公司社招面试记录,属于求职经验分享类文本,不包含任何嵌入式硬件设计、原理图、PCB、BOM、固件代码或可复现技术实现要素。其核心内容为Linux内核驱动与Android底层开发岗位的面试问答摘要,无硬件项目属性,不…...
别再裸写Delay!C语言RTOS移植必做的4层抽象重构:硬件驱动→BSP→HAL OS Wrapper→POSIX兼容层(已落地12个工业项目)
第一章:裸写Delay的陷阱与RTOS移植的认知革命 在资源受限的嵌入式系统中,初学者常以裸机方式实现毫秒级延时:通过循环计数或SysTick中断累加变量。这种看似简洁的 delay_ms() 实际埋下严重隐患——它阻塞整个CPU,使中断响应延迟不…...
003 TimeTagger 时间跟踪工具本地部署与开机自启
TimeTagger 本地部署与开机自启手册 一、TimeTagger 产品介绍 TimeTagger 是一款轻量级、开源免费的Web端时间跟踪工具,基于PythonWeb技术开发,支持本地离线运行、时间记录分类、数据统计分析,无需云端账号即可实现数据本地持久化存储&#…...
VibeVoice语音合成教学:新手如何30分钟内完成首次调用
VibeVoice语音合成教学:新手如何30分钟内完成首次调用 你是不是也想过,要是能有个工具,输入文字就能立刻听到语音,而且声音还特别自然,那该多方便?无论是给视频配音、做有声书,还是开发个智能语…...
