判断两个List<Map>是否相同以及其他类操作

2023-11-05

根据自身的业务,搞了个list 是否相等的方法,较笨拙,有更好的方法,欢迎各位大佬指教

仅根据自身业务编写,如需改动请自便。

改动也好改动,注释很详细



import com.google.common.collect.Maps;
import org.nutz.lang.Strings;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @title: CompareUtil
 * @description: 实体类操作工具类
 * @date: 2021/7/29
 * @author: stuil
 * @copyright: Copyright (c) 2021
 * @version: 1.0
 */
public class CompareUtil {


    /**
     * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异
     *
     * @param oldObject 进行属性比较的对象1
     * @param newObject 进行属性比较的对象2
     * @return 属性差异比较结果boolean
     */
    public static boolean compareObject(Object oldObject, Object newObject) {
        Map<String, Map<String, String>> resultMap = compareFields(oldObject, newObject, null);
        if (resultMap != null && resultMap.size() > 0) {
            return false;
        } else {
            return true;
        }
    }


    /**
     * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
     *
     * @param obj1      进行属性比较的对象1
     * @param obj2      进行属性比较的对象2
     * @param ignoreArr 忽略比较的字段
     * @return 属性差异比较结果map
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, Map<String, String>> compareFields(Object obj1, Object obj2, String[] ignoreArr) {
        try {
            Map<String, Map<String, String>> mapMap = Maps.newLinkedHashMap();

            List<String> ignoreList = null;
            if (ignoreArr != null && ignoreArr.length > 0) {
                // array转化为list
                ignoreList = Arrays.asList(ignoreArr);
            }
            // 只有两个对象都是同一类型的才有可比性
            if (obj1.getClass() == obj2.getClass()) {
                Class clazz = obj1.getClass();
                // 获取object的属性描述
                PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
                // 这里就是所有的属性了
                for (PropertyDescriptor pd : pds) {
                    // 属性名
                    String name = pd.getName();
                    // 如果当前属性选择忽略比较,跳到下一次循环
                    if (ignoreList != null && ignoreList.contains(name)) {
                        continue;
                    }
                    // get方法
                    Method readMethod = pd.getReadMethod();
                    // 在obj1上调用get方法等同于获得obj1的属性值
                    Object o1 = readMethod.invoke(obj1);
                    // 在obj2上调用get方法等同于获得obj2的属性值
                    Object o2 = readMethod.invoke(obj2);
                    if (o1 instanceof Timestamp) {
                        o1 = new Date(((Timestamp) o1).getTime());
                    }
                    if (o2 instanceof Timestamp) {
                        o2 = new Date(((Timestamp) o2).getTime());
                    }
                    if (o1 == null && o2 == null) {
                        continue;
                    }
                    o1 = Strings.sNull(o1);
                    o2 = Strings.sNull(o2);
                    // 比较这两个值是否相等,不等就可以放入map了
                    if (!o1.equals(o2)) {
                        Map<String, String> link1 = Maps.newLinkedHashMap();
                        link1.put((String) o1, (String) o2);
                        mapMap.put(name, link1);
                    }
                }
            }
            return mapMap;
        } catch (Exception e) {
            e.printStackTrace();
            return Maps.newLinkedHashMap();
        }
    }


    /**
     * @description: 指定字段转换map
     * @param obj1 对象/实体类
     * @param ignoreArr 字段的数组
     * @param:
     * @return:
     */
    public static Map<String, Object> objToMap(Object obj1, String[] ignoreArr) {
        try {
            Map<String, Object> mapMap = Maps.newLinkedHashMap();

            List<String> ignoreList = null;
            if (ignoreArr != null && ignoreArr.length > 0) {
                // array转化为list
                ignoreList = Arrays.asList(ignoreArr);
            }else {
                return Maps.newLinkedHashMap();
            }
            Class clazz = obj1.getClass();
            // 获取object的属性描述
            PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
            // 这里就是所有的属性了
            for (PropertyDescriptor pd : pds) {
                // 属性名
                String name = pd.getName();
                // 如果当前属性选择忽略比较,跳到下一次循环
                if (!ignoreList.contains(name)) {
                    continue;
                }
                // get方法
                Method readMethod = pd.getReadMethod();
                // 在obj1上调用get方法等同于获得obj1的属性值
                Object o1 = readMethod.invoke(obj1);
                if (o1 instanceof Timestamp) {
                    o1 = new Date(((Timestamp) o1).getTime());
                }
                if (o1 == null) {
                    continue;
                }
                // 塞值
                mapMap.put(name, o1);
            }
            return mapMap;
        } catch (Exception e) {
            e.printStackTrace();
            return Maps.newLinkedHashMap();
        }
    }

    /**
     * @description:
     * @param oldObj 原集合
     * @param newObj 现集合
     * @param arr 判断的条件集合(即根据什么条件判断是否相同,获取的两个 List<Map> --  old 和 new 里面的key 就是arr数据里的元素</>)
     * @return:
     */
    public static boolean compareList(List<? extends Object>  oldObj,List<? extends Object> newObj,String[] arr) {
        try {
            if (oldObj.size() == newObj.size()) {
                // old
                List<Map<String, Object>> oldMapList = oldObj.stream().map(map -> objToMap(oldObj, arr)).collect(Collectors.toList());
                // new
                List<Map<String, Object>> newMapList = newObj.stream().map(map -> objToMap(newObj, arr)).collect(Collectors.toList());
                // 是否相等
                return oldMapList.containsAll(newMapList);
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断两个List<Map>是否相同以及其他类操作 的相关文章

随机推荐

  • Transformer论文及源码笔记——Attention Is All You Need

    Transformer论文及源码笔记 Attention Is All You Need 综述 介绍 代码实现 编码模块 解码模块 综述 论文题目 Attention Is All You Need 时间会议 Advances in Neu
  • R语言作业--第六章判别分析

    目录 思考题4 原题目 贝叶斯判别的基本思想是什么 练习题第3题 以舒张期血压和讯将胆固醇含量预测被检查者是否患冠心病 测得15名冠心病人和16名健康人的舒张压 X1及血浆胆固醇含量X2 结果如表6 4 练习题第4题 对于A股市场2009年
  • 并查集平摊代价分析

    并查集平摊代价分析 1 并查集链表 Linked list representation of disjoint sets 1 1 最糙的链表 链表的每个结点有三个域 分别是head rep tail head是个指针 指向这个集合的第一个
  • GnuTLS recv error (-110): The TLS connection was non-properly terminated 解决(linux)

    原理是重新编译安装git 在linux终端按照下面命令一步一步执行即可 sudo apt get install build essential fakeroot dpkg dev y sudo apt get build dep git
  • 小程序开发完整教程

    微信使用的开发语言和文件很 特殊 小程序所使用的程序文件类型大致分为以下几种 WXML WeiXin Mark Language 微信标记语言 WXSS WeiXin Style Sheet 微信样式表 JS Java 小程序的主体 在语言
  • js断点和调试学习总结3

    使用Chrome调试JavaScript的断点设置和调试技巧 你是怎么调试 JavaScript 程序的 最原始的方法是用 alert 在页面上打印内容 稍微改进一点的方 法是用 console log 在 JavaScript 控制台上输
  • 插入方法(Insert Methods)

    进入MongoDB中文手册 4 2版本 目录 MongoDB提供了以下将文档插入到集合中的方法 方法 说明 db collection insertOne 将单个文档插入集合中 db collection insertMany 将多个 文档
  • 单元测试时间机器

    没有单元测试 您怎么称呼重构 任何人 是 这是一个技巧问题 不是吗 没有单元测试的重构不称为重构 这称为更改代码 甚至可以称其为破坏代码 随手添加测试 当您需要更改未经测试的代码时 添加单元测试很有用 您实际上可以添加两种类型 一个明显的用
  • STM32全国研讨会:且看Python 和OpenMV如何在 STM32 MCU上运行AI 2020-09-15 07:10 预计 24 分钟读完

    What is the state of machine learning at the edge today What tools can help engineers collect data and run inferences Wh
  • Rust学习笔记(三)——注释

    Rust学习笔记 三 注释 单行注释 多行注释 和大多数高级语言一样 Rust同样支持单行注释和多行注释 单行注释 单行注释是 或 开头的注释内容 Rust会将 或 到其后的第一个换行符之间的内容作为注释内容 所不同的是 以三个反斜杠 开头
  • 【安装教程】夜神模拟器+抓包工具mitmproxy

    夜神模拟器官网下载 应用商城搜索 小红书 下载软件即可 python 安装 mitmproxy 1 安装Microsoft Visual buildtools 链接 https pan baidu com s 1GyLNOOydBoOtNB
  • class from quick

    原文链接 http www jianshu com p 9587fffc7d8f 创建一个类 lua 定义名为 Shape 的基础类 local Shape class Shape ctor 是类的构造函数 在调用 Shape new 创建
  • OGG流媒体文件格式分析

    摘自 http www studa net yingyong 080505 16283240 html 摘 要 流媒体文件格式在流媒体系统中占有重要地位 设计合理的文件格式是提高流媒体服务器工作效率最直接和最有效的办法 该文在剖析常用流媒体
  • mac笔记本怎么外接显示屏_苹果MAC笔记本怎么外接显示屏

    苹果MAC笔记本外接显示器设置方法 步骤 1 如果要在 Mac 上外接显示器的话 首先是要考虑采用什么样的接口 一般我们是通过 VGA 或 HDMI 来外接显示器的 如果 Mac 电脑上没有可以外接显示器的 VGA 或 HDMI 接口的话
  • Anoconda安装open3d

    非虚拟环境安装需指定 user选项 pip install user open3d
  • 恐怖谷效应

    恐怖谷效应 Uncanny Valley 是仿真机器人领域中的一个理论 是指一个机器人的外貌或行为越来越逼真的过程中 观察者的心态会从认同到不适 再到认同这样一种现象 数学上X轴为接近度 Y轴为亲近感 则会出现一段山谷曲线 所以命名为恐怖谷
  • Nmap的介绍、安装 并进行网络扫描

    Nmap概述 Nmap Network Mapper 网络映射器 是一个网络连接端扫描软件 用来扫描网上电脑开放的网络连接端 确定哪些服务运行在哪些连接端 并且推断计算机运行哪个操作系统 这是亦称 fingerprinting 它是网络管理
  • K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

    原文 http www cnblogs com yixuan xu p 6272208 html K means聚类算法的三种改进 K means ISODATA Kernel K means 介绍与对比 一 概述 在本篇文章中将对四种聚类
  • 独立服务器的优点

    独立服务器有哪些优势 独立服务器的优势 1 稳定性好 一个人独享 拥有专业技术人员维护 2 独立服务器支持自动更新系统 自主设置安全策略以及系统环境是独立的 因此更加安全可靠 2 独立服务器操作系统中的http ftp ssh都是独立的 供
  • 判断两个List<Map>是否相同以及其他类操作

    根据自身的业务 搞了个list 是否相等的方法 较笨拙 有更好的方法 欢迎各位大佬指教 仅根据自身业务编写 如需改动请自便 改动也好改动 注释很详细 import com google common collect Maps import