Java - 检查部分对象相等性

标签 java object-comparison

我有一个根据对象的多个属性过滤一组对象的用例。我在 Javascript 中使用的一种方法可能是创建一个仅包含我关心的属性的对象,然后根据我希望过滤的对象检查这些属性名称。

示例( typescript ):

example(): void {
    let template = {
        name: 'Test',
        color: 'Blue'
    };

    let objects = [
        { name: 'Test', color: 'Blue' },
        { name: 'Test2', color: 'Blue' },
        { name: 'Test', color: 'Red' },
        { name: 'Test', color: 'Blue', extra: true },
    ];

    let results = objects.map(o => this.compare(o, template));
    console.log(results);
}

compare(obj, template): boolean {
    for (const prop in template) {
        if (obj[prop] !== template[prop]) {
            return false;
        }
    }

    return true;
}

上面的代码会将[true, false, false, true]写入控制台。这很酷的原因是它基本上可以接受任何对象并发出正确的结果。对于我来说,如何在 Java 中提供此功能并不明显,这样我就可以避免在数百个数据模型 bean 上实现比较功能。

是否有内置或常用的方法可以在 Java 中以通用方式进行等效比较?

最佳答案

这可以使用 reflection 来完成:

public static boolean compare(Object object, Object template) {
  Field[] templateFields = template.getClass().getDeclaredFields();
  try {
    for (Field templateField : templateFields) {
      Field objectField = object.getClass().getDeclaredField(templateField.getName());
      templateField.setAccessible(true);
      objectField.setAccessible(true);
      if (!objectField.get(object).equals(templateField.get(template))) {
        return false;
      }
    }
  } catch (Exception e) {
    return false;
  }
  return true;
}

(此代码仅显示想法,并未涵盖所有可能的情况,例如不检查继承的字段)

我不知道执行此操作的内置或常用方法。有utilities for strict comparison (通常用于单元测试),不确定它们是否适合您的用例。

请注意Java 9 modules可以限制对对象的反射访问。

关于Java - 检查部分对象相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58881545/

相关文章:

java - 如何为java swing应用程序设置图标?

java - 首次运行时 Android 静态类为 null

java - 我应该重写 Object.equals(Object) 方法吗?

php - in_array 如何检查对象是否在对象数组中?

java - Tomcat 6.0 碧 Jade 异常

java - hibernate .jpa.criteria.BasicPathUsageException : Cannot join to attribute of basic type

java - Java 中的线程最大数量?

java - Java中==和equals()有什么区别?

java - 嵌套属性比较