Comparator.comparing(...).thenComparing(...) 找出哪些字段不匹配

AMa*_*gic 8 java comparator java-8

我正在尝试比较同一类的两个对象,目标是比较它们并确定哪些字段不匹配。

我的域类示例

@Builder(toBuilder=true)
class Employee {
     String name;
     int age;
     boolean fullTimeEmployee;
}
Run Code Online (Sandbox Code Playgroud)

两个对象

Employee emp1 = Employee.builder().name("john").age(25).fullTime(false).build();
Employee emp2 = Employee.builder().name("Doe").age(25).fullTime(true).build();
Run Code Online (Sandbox Code Playgroud)

比较两个对象

int result = Comparator.comparing(Employee::getName, Comparator.nullsFirst(Comparator.naturalOrder()))
                       .thenComparing(Employee::getAge, Comparator.nullsFirst(Comparator.naturalOrder()))
                       .thenComparing(Employee::isFullTimeEmployee, Comparator.nullsFirst(Comparator.naturalOrder()))
                       .compare(emp1, emp2);
Run Code Online (Sandbox Code Playgroud)

结果将是0因为name&fullTime字段彼此不匹配。

但我也想生成一个不匹配的字段列表......如下所示

List<String> unmatchedFields = ["name","fulltimeEmployee"];
Run Code Online (Sandbox Code Playgroud)

我可以用更好的方式来做,而不是一堆 if() else

wax*_*ing 1

查看DiffBuilder。它可以报告哪些项目不同。

DiffResult<Employee> diff = new DiffBuilder(emp1, emp2, ToStringStyle.SHORT_PREFIX_STYLE)
       .append("name", emp1.getName(), emp2.getName())
       .append("age", emp1.getAge(), emp2.getAge())
       .append("fulltime", emp1.getFulltime(), emp2.getFulltime())
       .build();
Run Code Online (Sandbox Code Playgroud)

DiffResult除此之外,还有一个getDiffs()方法,您可以循环查找不同之处。

  • @Eugene,你这么说就好像使用“Comparator::comparing”是一个优势。 (2认同)
  • @Eugene 这个答案的代码也确保了这些方法是理所当然的。除此之外,您现在正在描述方法引用,这与在根本不涉及比较的任务中滥用“Comparator::comparing”完全不同。 (2认同)