java封装的比较器,比较是否全相同,获取不同字段名字

2023-10-30

 非常实用的java比较器,贴上代码:

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mchange.v1.lang.NullUtils;

@SuppressWarnings("deprecation")
public class JVisaCommonCompare {
   
   private static Logger LOGGER = LoggerFactory.getLogger(JVisaCommonCompare.class);
   
   /** 获取不同值的字段(可以不同类型) */
   public static <S extends Object, T extends Object> Set<String> getDifferentFieldName(S source, T target, List<String> excludeFieldName) {
      LOGGER.info("======================getDifferentFieldName,source:[{}],target:[{}]",
            ToStringBuilder.reflectionToString(source), ToStringBuilder.reflectionToString(target));
      Set<String> fieldName = new HashSet<>();
      if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) {
         return fieldName;
      }
      JsonConfig config = new JsonConfig();
      if (!CollectionUtils.isEmpty(excludeFieldName)) {
         String[] excludeArray = excludeFieldName.toArray(new String[excludeFieldName.size()]);
         config.setExcludes(excludeArray);
      }
      JSONObject sourceObj = JSONObject.fromObject(source, config);
      JSONObject targetObj = JSONObject.fromObject(target, config);
      fieldName = getAllDifferentFieldName(sourceObj, targetObj, config);
      LOGGER.info("======================getDifferentFieldName,result:[{}]", fieldName);
      return fieldName;
   }
   
   /** 判断两个对象是否每个字段都相等 */
   public static <S extends Object, T extends Object> Boolean isAllTheSameOfObject(S source, T target, List<String> excludeFieldName) {
      LOGGER.info("======================isAllTheSameOfObject,source:[{}],target:[{}]",
            ToStringBuilder.reflectionToString(source), ToStringBuilder.reflectionToString(target));
      Set<String> fieldName = new HashSet<>();
      if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) {
         return true;
      }
      JsonConfig config = new JsonConfig();
      if (!CollectionUtils.isEmpty(excludeFieldName)) {
         String[] excludeArray = excludeFieldName.toArray(new String[excludeFieldName.size()]);
         config.setExcludes(excludeArray);
      }
      JSONObject sourceObj = JSONObject.fromObject(source, config);
      JSONObject targetObj = JSONObject.fromObject(target, config);
      fieldName = getAllDifferentFieldName(sourceObj, targetObj, config);
      if (CollectionUtils.isEmpty(fieldName)) {
         return true;
      }
      return false;
   }
   
   /** 获取不同值的字段名字(任何不同类型比较) */
   @SuppressWarnings({ "unused", "unchecked" })
   private static Set<String> getAllDifferentFieldName(JSONObject source, JSONObject target, JsonConfig config) {
      Set<String> fieldName = new HashSet<>();
      if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) {
         return fieldName;
      }
      // if exist JSONObject is null

      if (BooleanUtils.isTrue(source.isNullObject())) {
         fieldName = new HashSet<>(JSONArray.toCollection(config == null ? target.names() : target.names(config)));
         return fieldName;
      }
      if (BooleanUtils.isTrue(target.isNullObject())) {
         fieldName = new HashSet<>(JSONArray.toCollection(config == null ? source.names() : source.names(config)));
         return fieldName;
      }
      // set the config of field

      JSONArray fieldKeySource = null;
      JSONArray fieldKeyTarget = null;
      if (null != config) {
         fieldKeySource = source.names(config);
         fieldKeyTarget = target.names(config);
      } else {
         fieldKeySource = source.names();
         fieldKeyTarget = source.names();
      }
      // compare

      for (int sindex = 0; null != fieldKeySource && sindex < fieldKeySource.size(); sindex++) {
         Object key = fieldKeySource.get(sindex);
         if (!BooleanUtils.isTrue(target.containsKey(key))) {
            fieldName.add((String) key);
            continue;
         }
         Object value1 = source.get(key);
         Object value2 = target.get(key);
         if (!ObjectUtils.equals(value1, value2)) {
            fieldName.add((String) key);
         }
      }
      for (int tindex = 0; null != fieldKeyTarget && tindex < fieldKeyTarget.size(); tindex++) {
         Object key = fieldKeyTarget.get(tindex);
         if (!BooleanUtils.isTrue(source.containsKey(key))) {
            fieldName.add((String) key);
            continue;
         }
         Object value2 = target.get(key);
         Object value1 = source.get(key);
         if (!ObjectUtils.equals(value2, value1)) {
            fieldName.add((String) key);
         }
      }
      return fieldName;
   }
   
}

 

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

java封装的比较器,比较是否全相同,获取不同字段名字 的相关文章

  • LDAP概念和原理

    http blog sina com cn s blog 6151984a0100ey3z html 什么是目录服务 目录服务就是按照 树状存储信息的模式 目录服务的特点 目录服务与关系型数据库不同 目录服务的数据类型主要是字符型 而不是关
  • 如何通过redis 配置提高redis的性能

    redis的性能 我拿什么拯救 持久化选项 客户端输出缓冲限制 数据结构优化 压缩列表 网络配置 连接池 客户端输出缓冲限制 数据结构优化 压缩列表 网络配置 连接池 不冷战 不任性 多沟通 用舒服的方式喜欢和爱 知道承担 懂得分享 一起进
  • 组件扫描功能

    Spring提供了注解扫描 利用组件扫描注解和组件注解配合 可以自动扫描包空间自动创建Bean对象 减少编码 提高效率 配置文件 Configuration ComponentScan basePackages cn tedu Demo p
  • 数据结构——深度优先遍历(DFS)无向连通图

    以下是数据结构中关于深度优先遍历无向连通图的操作 编程风格参考严蔚敏版数据结构 其实深度优先遍历就是二叉树的先序遍历的推广 头文件以及宏定义 include
  • GitHub博客地址

    本人博客主要发布在GitHub Pages CSDN上的博客不再更新 我的GitHub博客地址 Hong s Bloghttps yalandhong github io 备用链接 https yalandhong vercel app h
  • IDEA解决运行项目虚拟内存溢出问题

    在我们运行一个比较大的项目的时候总是出现Caused by java lang OutOfMemoryError PermGen space的问题简单在网上查询了一下意思是内存溢出了 什么 我的电脑是8G运行内存 256的固态 你告诉这样都
  • bigquant量化平台笔记

    https bigquant com tutorial 宽客学院 https bigquant com community t topic 131694 AI量化策略快速理解 AI量化策略的目标 Label 默认使用股票收益率作为目标 第一
  • 关于antd的treeselect使用

    在表单中 我们可能会碰到这样的需求 比如我想将某一个物品或者资产 分配到某一个部门的员工下 那么我们需要在表单中做这样的配置 这样就会用到antd的treeselect组件 组件很好用 自带搜索框 可以大大的提高用户的可操作性 我们来看一下
  • 【CentOS安装配置Jupyter 】

    CentOS安装配置Jupyter 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 SmartyPants 创建一个自
  • 攻防世界之misc1

    攻防世界之misc1 首先这题非常的考研脚本实力 他题目没有下载文件 只有一个值 d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b
  • Nginx Upstream负责均衡的实现方案

    nginx中upstream实现负责均衡的几种方式 1 轮询 weight 1 默认选项 当weight不指定时 各服务器weight相同 每个请求按时间顺序逐一分配到不同的后端服务器 如果后端服务器down掉 能自动剔除 upstream
  • commons math用户手册翻译(一)

    翻译源址 http commons apache org proper commons math userguide index html 1 math包版本3 6 2 commons math包解决哪些问题 math包由一组数据和统计的包
  • jmavsim使用说明

    一 启动 在px4源码目录下输入 make px4 sitl jmavsim 二 基础操作 在操作界面上按F1键 会弹出操作说明 操作说明如下 按照说明可以控制飞机移动 视角控制 F 第一人称视角 S 地面固定视角 G 稳定云台视角 Z 切
  • jsp 页面选项卡

  • 使用阿里巴巴的EasyExcel操作Excel

    引入依赖
  • 使用TortoiseGit执行merge/rebase操作

    如果使用git 相信大家比较多的使用merge 对于rebase则少有陌生 相信刚使用git不久的同学会有一个困惑 经常使用merge会造成破窗效应 查阅log时会掺杂了大量无用的小提交 起初也对此习以为常 毕竟svn就是这样 使用reba
  • js中background-position 无效

    css中正确书写background position x y 坐标之间有空格 然而在写js的时候如果粗心会忘记第一个 px 后面加个空格 正确js书写应该是backgroundposi x px y px
  • Docker基本概念、linux

    Docker的基本概念 一 认识容器 1 1 容器是什么 1 2 对比容器和虚拟机 1 2 1 虚拟化的差异 1 2 2 资源利用总结 二 Docker基本概念 2 1 Docker是什么 2 2 Docker 的思想与核心 2 3 Doc
  • Qt-常用数据类型

    常用基本数据类型 类型名称 注释 备注 qint8 signed char 有符号8位数据类型 qint16 signed short 有符号16位数据类型 qint32 signed int 有符号32位数据类型 qint64 long

随机推荐