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

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
分享到:
评论

相关推荐

    jar包差异比较器

    总的来说,"jar包差异比较器"是Java开发者必备的工具之一,它的价值在于能有效提升软件维护和管理的效率,帮助开发者快速定位问题,确保软件的质量和稳定性。在使用时,应结合源代码管理工具如Git,共同构建起完善的...

    java提取数据库表字段信息的工具类.docx

    在Java开发中,有时我们需要获取数据库表的字段信息,例如字段名称、字段类型等,以便在编程时创建对应的Java实体类。为了简化这一过程,我们可以编写一个工具类来实现这个功能。下面是一个简单的示例,展示了如何...

    Java文件选择器Java文件选择器Java文件选择器Java文件选择器

    根据提供的信息,我们可以总结出以下有关“Java文件选择器”的知识点: ### Java 文件选择器概述 在Java开发中,文件选择器是一种常见的图形用户界面组件,用于帮助用户从文件系统中选择文件或目录。通常,这涉及...

    两个集合比较(新增、编辑、删除)

    - `findEditedItems(List&lt;T&gt; oldList, List&lt;T&gt; newList, Comparator&lt;T&gt; comparator)`:根据比较器找出被编辑的元素。 - `findDeletedItems(List&lt;T&gt; oldList, List&lt;T&gt; newList)`:返回在`newList`中被删除的元素。 ...

    《JAVA语言程序设计》期末考试试题及答案_java期末考试_java_

    此外,还可能涉及泛型、迭代器和比较器的概念。 6. **输入输出流**:I/O流的概念,包括字节流和字符流,以及FileInputStream、FileOutputStream、BufferedReader、PrintWriter等类的使用。 7. **多线程**:线程的...

    比较全面java面试题

    - 构造器、方法和字段的反射API。 11. **设计模式**: - 单例模式,工厂模式,装饰器模式,观察者模式等常见设计模式的应用。 12. **JVM优化**: - 参数调整:堆大小,新生代与老年代比例,GC策略等。 - 性能...

    java反射学习资料

    比较两个类是否相等,实际上是比较它们的`Class`对象是否相同。 #### 二、获取类信息的方法 反射提供了多种方法来获取类的详细信息,包括但不限于: 1. **`getName()`**: 返回类的全名。 2. **`getSuperClass()`*...

    java http多线程下载器

    在下载器中,多线程技术可以被用来并行下载文件的不同部分,从而提高下载效率。每个线程负责下载文件的一部分,当所有线程完成其任务后,将各个部分合并成完整的文件。 ### 3. 分块下载 在多线程下载中,大文件会被...

    Java毕业生校外实习日记.doc

    * 数组列表(ArrayList):可以排序,需要提供比较器(Comparator)或者实现 Comparable 接口 * linkedList:有序的链表,可以排序 * Vector:线程安全的集合,可以排序 * Set:无序、不可重复的集合 + HashSet:不...

    java 30个基本概念

    8. **方法重载(Overloading)**:在同一个类中,如果方法名字相同但参数列表不同,就构成了方法重载。编译器会根据传入的参数类型选择合适的方法执行。 9. **包(Package)**:包是Java组织类的一种方式,可以将...

    core java 卷1 pdf

    包括迭代器、比较器、并发集合、Lambda表达式和Stream API等内容,这些是提高代码效率和简洁性的关键工具。 十八、JavaFX JavaFX是一个用于构建桌面、移动和嵌入式设备的富客户端应用程序的框架,提供了丰富的UI...

    JAVA面试题库,好几套JAVA面试题,比较受用

    多态则是在不同对象上调用相同方法时表现出不同行为的能力。 - **构造器与this关键字**:构造器用于初始化对象,this关键字用来引用当前对象实例。 - **访问修饰符**:public、private、protected和默认访问修饰符...

    java中的反射机制

    1. **`java.lang.reflect.Field`** —— 表示类中的字段(属性),可以用来获取或设置字段的值。 2. **`java.lang.reflect.Method`** —— 表示类中的方法,可以用来调用对象的方法。 3. **`java.lang.reflect....

    java基础教程ppt

    - **类的定义**:封装、继承和多态三大特性,以及构造器的使用。 - **对象的创建与销毁**:实例化过程,对象的生命周期,以及垃圾回收机制。 - **访问修饰符**:public、private、protected和默认访问修饰符的...

    JAVA基础课程讲义

    JAVA分为多个版本,如JDK(Java Development Kit)、JRE(Java Runtime Environment)和不同的服务端版本。JAVA程序的运行机制基于JVM(Java Virtual Machine),JVM使得JAVA程序可以在任何支持JVM的平台上运行。JRE...

    java学习资料

    还会讨论泛型、迭代器和比较器的概念。 3. **2类、对象和接口.ppt**: 类和对象是面向对象编程的基础。这部分会讲解如何定义类,包括属性(字段)和方法(函数),以及如何创建和实例化对象。接口作为契约,定义了...

    Java全阶段综合笔试面试题(含答案).docx

    ### Java全阶段综合笔试面试题知识点解析 #### 一阶段:基础知识点 1. **JRE、JDK、JVM的关系** - **JRE** (Java Runtime Environment): 包括了Java虚拟机(JVM)及Java核心类库,是运行Java程序所需的环境。 - **...

    JAVA面试题最新全集

    2. **集合框架**:Java集合框架是面试中常考的部分,包括List、Set、Queue、Map等接口及其实现类如ArrayList、LinkedList、HashSet、HashMap等的特性和用法,以及泛型、迭代器、比较器等概念。 3. **多线程与并发**...

    java 学习PPT课件

    18. **Java集合高级**:TreeSet、TreeMap、LinkedHashMap等集合类的特性,以及集合框架中的迭代器和比较器。 19. **Java网络编程**:Socket编程,ServerSocket的使用,以及基于HTTP协议的网络通信。 20. **Java...

Global site tag (gtag.js) - Google Analytics