`
qifeifei
  • 浏览: 27189 次
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

 非常实用的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;
   }
   
}

 

2
2
分享到:
评论

相关推荐

    Thinking in Java简体中文(全)

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    java 编程入门思考

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    Java初学者入门教学

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    java联想(中文)

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    Java EE常用框架.xmind

    Java EE常用框架 WebService 介绍 基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用 术语 XML. Extensible Markup Language -扩展性标记语言 WSDL – ...

    JAVA_Thinking in Java

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    Thinking in Java 中文第四版+习题答案

    13.18.4 Bean的封装 13.18.5 更复杂的Bean支持 13.18.6 Bean更多的知识 13.19 Swing入门 13.19.1 Swing有哪些优点 13.19.2 方便的转换 13.19.3 显示框架 13.19.4 工具提示 13.19.5 边框 13.19.6 按钮 13.19.7 按钮组...

    Java微服务架构l零从基础到精通高清视频教程全套 163课

    Java微服务架构l零从基础到精通高清视频教程全套 第1章 微服务简介 001构建单体应用 002微服务解决复杂问题 003微服务的优点 004微服务的缺点 第2章 Linux使用 005Linux 简介 006Linux 与 Windows 比较 007...

    Java微服务架构163课

    全套微服务架构,视频学习java微服务架构,包括如下 第1章 微服务简介 001构建单体应用 002微服务解决复杂问题 003微服务的优点 004微服务的缺点 第2章 Linux使用 005Linux 简介 006Linux 与 Windows ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm ------------------------------------------------- 本教程由yyc,spirit整理 ------------------------------------------------- “Thinking in Java...

    Think in Java(中文版)chm格式

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的...

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    本人在教Java方向课程时,发现现组长们不能象以前班级的学长写出封装得比较好的DAO工具类。于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK ...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    180多页面试题,前前后后不间断的更新了两年,准备换工作时,总是拿来看看,有比较好的面试题,也不间断的更新,面试题目录如下: 【基础】面向对象的特征有哪些方面 13 抽象 13 继承 13 封装 13 多态性 13 【基础】...

    oca-preparacao-alura:这个项目是练习基本的Java。 为我准备Oracle认证助理Java程序员测试

    比较和对比Java的功能和组件,例如:平台独立性,面向对象,封装等。 声明和初始化变量(包括基本数据类型的转换) 区分对象引用变量和原始变量 知道如何读写对象字段 解释对象的生命周期(创建,“通过重新分配...

    Eclipse中文使用教程

    6 .6自行封装字段 ( Self Encapsulating a Field ) 7 .要诀和技巧 (Tips and Tricks ) 7 .1编辑程序文件 ( Editing Source ) 7 .2搜寻 ( Searching ) 7 .3程序代码导览和读取 ( Code navigation and reading ) 7 .4...

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    Eclipse 中文教程

    6.6自行封装字段(Self Encapsulating a Field) 201 7.要诀和技巧(Tips and Tricks) 204 7.1编辑程序文件(Editing Source) 204 7.2搜寻(Searching) 209 7.3程序代码导览和读取(Code navigation and reading) 210 7.4 ...

    eclipse 中文版教程

    66 自行封装字段(Self Encapsulating a Field) 263 7要诀和技巧(Tips and Tricks) 267 71 编辑程序文件(Editing Source) 267 wwwalibubucom Eclipse 中文教程doc 第 7 頁,共 288 頁 72 搜寻(Searching) 272 ...

    ThinkInJava

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

Global site tag (gtag.js) - Google Analytics