【问题标题】:How to compare two objects in Java 8 [closed]如何比较 Java 8 中的两个对象 [关闭]
【发布时间】:2017-12-05 14:34:10
【问题描述】:

让我们举个例子,你有两个具有相同值的员工对象,如下所示。

Employee employee1 = new Employee(1001, "Sam", 20000);
Employee employee2 = new Employee(1001, "Sam", 20000);
if(doCompareEmployees(employee1, employee2)){
    System.out.println("Both employee objects are same.");
}else{
    System.out.println("Both employee objects are not same.");
}

//Here is compare method using java 8.

private boolean doCompareEmployees(Employee employee1, Employee employee2) {
int returnValue = Comparator.comparing(Employee::getID)
    .thenComparing(Employee::getName)
    .thenComparing(Employee::getSalary)
    .compare(employee1, employee2);
    if (returnValue != 0){
        return false;
    }   
    return true;
}

我想知道,有没有其他更好的方法来比较 Java 8 中的对象?

【问题讨论】:

  • 除非您想要基于特定字段的自定义比较,否则首选方法是在您的 Employee 类中覆盖 equals (并且哈希码保持一致)并摆脱这个由 @ 替换的 doCompareEmployees 方法改为 987654324@。
  • 标准选项仍然是向Employee 添加适当的equals 方法。如果这是不可能的,最好的属性检查方法也没有改变:return employee1.getID()==employee2.getID()) && employee1.getName().equals(employee2.getName()) && employee1.getSalary()==employee2.getSalary());
  • 有很多可能的方式,一些默认实现 Comparable 的类已经预先构建了你可以使用的“自然顺序”,或者如果你需要一些特定的东西,你可以使用 Comparator 接口并定义你自己的排序方法。

标签: java java-8 compareobject


【解决方案1】:

如果您不想在对象上定义排序,通常您不会编写 Comparator。

为类定义相等的典型方法是同时定义equals()hashCode() 方法。要实现hashCode()Objects.hash() 可以提供帮助(从 Java 7 开始存在)。

public int hashCode() {
    return Objects.hash(id, name, salary);
}

public boolean equals(Object o) {
    if (o == this) return true;
    if (o == null || o.getClass() != getClass()) return false;
    Employee e = (Employee) o;
    return id == e.id && salary == e.salary && Objects.equals(name, e.name);
}

虽然 lambda 表达式在某些情况下允许编写非常优雅的代码,但它们并不是每个问题的最佳解决方案。

【讨论】:

  • 直到现在我才知道Objects.hash()。这太棒了:-)
【解决方案2】:

您可以查看此LambdaEquals 实用程序。但是,作为一个好习惯,您应该坚持使用等式覆盖以获得最佳性能。覆盖“equals”方法可能比 Comparator.comparing 更快。

下面是与 Hoopje 提供的相同的覆盖示例,只是略有不同。

在Employee类中重写equals方法:

public class Employee {
.....
.....
@Override
public boolean equals(Object o) {
     if(super.equals(o)) {
         return true;
     }
    if(!(o instanceof Employee)) {
        return false
    }

    Employee otherEmployee = (Employee) o;

    return 
        id == otherEmplyee.getId &&
        name == otherEmplyee.getName() &&
        salary == otherEmplyee.getSalary;

}


//Use the equal method
if(emp1.equals(emp2) {
    //do something
}

【讨论】:

  • super.equals(0)???
  • @ZhekaKozlov 对不起,我的错。错字:)
  • 我会把它改成this == o
  • == 比较参考,而不是值。你会得到错误的结果
  • 在这种情况下,super.equals(o)this == o 是等价的,因为Employee 的直接超类是Object,而Object.equals() 是根据== 实现的。但是,通常您不想以您的方式调用super.equals(o)。假设EmployeeA 的子类并继承其salary 字段。然后new Employee(1, "John", 10).equals(new Employee(2, "Mark", 10)) == true,因为两者的薪水相同,因此A.equals(o) 将返回true。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2011-10-02
  • 2013-04-10
  • 1970-01-01
相关资源
最近更新 更多