Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌套list等场景

实体字段比较器(对比两组对象找出发生变化的字段工具类开发)

支持枚举映射

支持时间

支持显示对应字段中文描述

支持嵌套list等场景

下载地址
Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌套list等场景-超越其他工具.rar

最新版本更新
https://code.jiangjiesheng.cn/article/366?from=csdn

复制代码
package cn.jiangjiesheng.annoation.entitycomparator.demo;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import cn.jiangjiesheng.service.impl.common.entitycomparator.demo.bizentity.SubTask;
import cn.jiangjiesheng.service.impl.common.entitycomparator.demo.bizentity.Task;
import cn.jiangjiesheng.service.impl.common.entitycomparator.demo.bizenum.Enum1Priority;
import cn.jiangjiesheng.service.impl.common.entitycomparator.demo.bizenum.Enum2Status;
import cn.jiangjiesheng.service.impl.common.entitycomparator.demo.bizenum.Enum3Type;
import cn.jiangjiesheng.service.impl.common.entitycomparator.impl.EntityComparator;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 对比两组对象找出发生变化的字段工具类 测试验证
 */
public class EntityComparatorDemo {

    public static void main(String[] args) throws Exception {
        String dateStr = "2025-03-04 12";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
        // 解析字符串为LocalDateTime对象
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr, formatter);
        // 如果需要转换为旧的Date类型
        Date date = java.sql.Timestamp.valueOf(localDateTime);
        SubTask oldSubTask = new SubTask("SubTaskOld", date, Enum2Status.PENDING, "2025-01-01");
        SubTask newSubTask = new SubTask("SubTaskNew", DateUtil.beginOfWeek(new Date()), Enum2Status.COMPLETED, "2025-01-02");

        List<SubTask> oldSubTasks = new ArrayList<>();
        oldSubTasks.add(oldSubTask);

        List<SubTask> newSubTasks = new ArrayList<>();
        newSubTasks.add(newSubTask);
        //再来一组,老的是空
        newSubTasks.add(newSubTask);

        Task oldTask = new Task(Enum1Priority.LOW, Enum2Status.PENDING, Enum3Type.TYPE_A.getCode(), oldSubTasks, oldSubTask, "2025-01-01");
        Task newTask = new Task(Enum1Priority.HIGH, Enum2Status.COMPLETED, Enum3Type.TYPE_B.getCode(), newSubTasks, newSubTask, "2025-01-02");

        List<EntityComparator.ChangeInfo> changes = EntityComparator.compareEntities(oldTask, newTask);

        // for (ChangeInfo change : changes) {
        //     System.out.println("Field: " + change.getFieldName());
        //     System.out.println("Description: " + change.getFieldDesc());
        //     System.out.println("Old Value: " + change.getOldValue());
        //     System.out.println("New Value: " + change.getNewValue());
        //     System.out.println();
        // }

        //这个保持了顺序,但是json结构混乱
        System.out.println("保持了顺序,但是json结构混乱:");
        System.out.println(EntityComparator.ChangeInfo.toOrderedJson(changes));
        System.out.println();
        // 这个未保持顺序,但是json结构清晰
        System.out.println("未保持顺序,但是json结构清晰:");
        System.err.println(JSONUtil.toJsonPrettyStr(changes));

    }
}

对比结果示例:

复制代码
[ {
  "fieldDesc" : "任务优先级",
  "fieldName" : "enum1Priority",
  "newValue" : "高优先级",
  "oldValue" : "低优先级"
},
 {
  "fieldDesc" : "任务状态",
  "fieldName" : "enum2Status",
  "newValue" : "已完成",
  "oldValue" : "待处理"
},
 {
  "fieldDesc" : "任务类型",
  "fieldName" : "taskType",
  "newValue" : "类型B",
  "oldValue" : "类型A"
},
 {
  "child" : [
[ {
    "fieldName" : "subTasks[0].name",
    "fieldDesc" : "子任务名称",
    "oldValue" : "",
    "newValue" : "SubTaskNew"
  },
 {
    "fieldName" : "subTasks[0].dateTime",
    "fieldDesc" : "时间日期类型",
    "oldValue" : "",
    "newValue" : "2025-04-07 00"
  },
 {
    "fieldName" : "subTasks[0].enum2Status",
    "fieldDesc" : "子任务状态",
    "oldValue" : "",
    "newValue" : "已完成"
  },
 {
    "fieldName" : "subTasks[0].createdAt",
    "fieldDesc" : "创建时间",
    "oldValue" : "",
    "newValue" : "2025-01-02"
  } ],
[ {
    "fieldName" : "subTasks[1].name",
    "fieldDesc" : "子任务名称",
    "oldValue" : "",
    "newValue" : "SubTaskNew"
  },
 {
    "fieldName" : "subTasks[1].dateTime",
    "fieldDesc" : "时间日期类型",
    "oldValue" : "",
    "newValue" : "2025-04-07 00"
  },
 {
    "fieldName" : "subTasks[1].enum2Status",
    "fieldDesc" : "子任务状态",
    "oldValue" : "",
    "newValue" : "已完成"
  },
 {
    "fieldName" : "subTasks[1].createdAt",
    "fieldDesc" : "创建时间",
    "oldValue" : "",
    "newValue" : "2025-01-02"
  } ],
[ {
    "fieldName" : "subTasks[2].name",
    "fieldDesc" : "子任务名称",
    "oldValue" : "",
    "newValue" : "SubTaskNew"
  },
 {
    "fieldName" : "subTasks[2].dateTime",
    "fieldDesc" : "时间日期类型",
    "oldValue" : "",
    "newValue" : "2025-04-07 00"
  },
 {
    "fieldName" : "subTasks[2].enum2Status",
    "fieldDesc" : "子任务状态",
    "oldValue" : "",
    "newValue" : "已完成"
  },
 {
    "fieldName" : "subTasks[2].createdAt",
    "fieldDesc" : "创建时间",
    "oldValue" : "",
    "newValue" : "2025-01-02"
  }
 ]
 ],
  "fieldDesc" : "子任务列表",
  "fieldName" : "subTasks"
},
 {
  "fieldDesc" : "子任务名称",
  "fieldName" : "subTask.name",
  "newValue" : "SubTaskNew",
  "oldValue" : "SubTaskOld"
},
 {
  "fieldDesc" : "时间日期类型",
  "fieldName" : "subTask.dateTime",
  "newValue" : "2025-04-07 00",
  "oldValue" : "2025-03-04 12"
},
 {
  "fieldDesc" : "子任务状态",
  "fieldName" : "subTask.enum2Status",
  "newValue" : "已完成",
  "oldValue" : "待处理"
},
 {
  "fieldDesc" : "创建时间",
  "fieldName" : "subTask.createdAt",
  "newValue" : "2025-01-02",
  "oldValue" : "2025-01-01"
},
 {
  "fieldDesc" : "创建时间",
  "fieldName" : "createdAt",
  "newValue" : "2025-01-02",
  "oldValue" : "2025-01-01"
} ]

最新版本更新
https://code.jiangjiesheng.cn/article/366?from=csdn

相关推荐
m0_6845985329 分钟前
如何开发英语在线训练小程序:从0到1的详细步骤
java·微信小程序·小程序·小程序开发
ml1301852887434 分钟前
开发一个环保回收小程序需要哪些功能?环保回收小程序
java·大数据·微信小程序·小程序·开源软件
zybishe2 小时前
免费送源码:Java+ssm+MySQL 酒店预订管理系统的设计与实现 计算机毕业设计原创定制
java·大数据·python·mysql·微信小程序·php·课程设计
anlogic3 小时前
Java基础 4.12
java·开发语言
weisian1513 小时前
Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)
java·安全·阿里云
农民小飞侠3 小时前
ubuntu 安装pyllama教程
linux·python·ubuntu
橘猫云计算机设计4 小时前
基于Python电影数据的实时分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·后端·python·信息可视化·小程序·毕业设计
Alt.94 小时前
SpringMVC基础二(RestFul、接收数据、视图跳转)
java·开发语言·前端·mvc
寒页_4 小时前
2025年第十六届蓝桥杯省赛真题解析 Java B组(简单经验分享)
java·数据结构·经验分享·算法·蓝桥杯
蹦蹦跳跳真可爱5894 小时前
Python----机器学习(基于贝叶斯的鸢尾花分类)
python·机器学习·分类