Java 比较两个对象时如何排除空字段?

Java 比较两个对象时如何排除空字段?,java,intellij-idea,Java,Intellij Idea,我有这样一个问题,我在我的应用程序中以两种不同的方式用数据填充对象。 所以有时候可能会发生,一个有一些空字段,而第二个没有。 我想以一种方式比较这两个对象,当一个对象有一个空值的字段时,这个字段将被排除在比较之外。 有人知道如何在实践中做到这一点吗? 对我来说,最好的方法是使用一些伪equals()方法模板,我可以使用它来生成代码,就像使用equals()和hashCode()一样。。。InteliJ的发电机。 或者使用一些匹配器,但我没有找到:/ class A { T f1; T f2; T

我有这样一个问题,我在我的应用程序中以两种不同的方式用数据填充对象。 所以有时候可能会发生,一个有一些空字段,而第二个没有。 我想以一种方式比较这两个对象,当一个对象有一个空值的字段时,这个字段将被排除在比较之外。 有人知道如何在实践中做到这一点吗? 对我来说,最好的方法是使用一些伪equals()方法模板,我可以使用它来生成代码,就像使用equals()和hashCode()一样。。。InteliJ的发电机。 或者使用一些匹配器,但我没有找到:/

class A {
T f1;
T f2;
T f3;
}

A a1 = new A(value1, value2, value3);
A a2 = new A(value1, null, value3);
a1.伪等于(a2)
=>真

因此,我希望InteliJ中的生成器模板能够生成如下内容:

public boolean pseudoEquals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (f1 == null && f2 == null && f3 == null) return false;

        A that = (A) o;
        if (that.f1 == null && that.f2 == null && that.f3 == null) return false;   

        if ((f1 != null && that.f1 != null) && !f1.equals(that.f1)) return false;
        if ((f2 != null && that.f2 != null) && !f2.equals(that.f2)) return false;
        if ((f3 != null && that.f3 != null) && !f3.equals(that.f3)) return false;

        return true;
    }
有谁能告诉我如何创建这样一个模板,或者有谁有更好的模板吗?:)
谢谢。

首先,你为什么要这样做?您可能需要仔细考虑您的
pseudoEquals()
是否是您真正想要解决的问题的最佳解决方案。你可能也想分享你的想法,周围有很多聪明的人给你建议

如果你说的是真的,这不只是一个辅助类的问题吗

public class MyObjects {
    public static boolean equalIfNotNull(Object attr1, Object attr2) {
        return attr1 == null || attr2 == null || attr1.equals(attr2);
    }
}
现在在
pseudoEquals()
中,您可以执行以下操作

        return MyObjects.equalIfNotNull(f1, that.f1)
                && MyObjects.equalIfNotNull(f2, that.f2)
                && MyObjects.equalIfNotNull(f3, that.f3);
编辑:更多想法:

  • 使用varargs和方法引用可以使其更加优雅:
    MyObjects.pseudoEqual(这个、那个、A::getF1、A::getF2、A::getF3)
  • 您可以使用一些反射魔法来检测类的所有实例字段,并执行所需的逻辑

当然,如果您愿意,可以为IntelliJ IDEA编写一个插件,为您生成代码。可能是过火了?

可能是@santoshgore的重复-它与您添加的问题不同。好的,但是为什么需要这个代码作为模板呢?第二件事,它应该被实现为object的equal()方法,Java知道如何显式地使用它。@h_u-这是Java的基础。在问题中,他问在比较两个对象时如何排除空字段。这与在Java中检查字段的空值相同。在我发布的重复问题中,可能存在重复,您会发现可以为
equals()
方法添加自定义模板。我还没有尝试过,但也许你甚至可以在模板中更改方法签名…谢谢。我更喜欢生成器,我有很多DTO,有时有很多数据成员。所以我要用这种方式来尝试。