首页  >  文章  >  Java  >  为什么 Java 8 的 Lambda 方法是对具有多个字段的对象进行排序的最佳方法?

为什么 Java 8 的 Lambda 方法是对具有多个字段的对象进行排序的最佳方法?

Linda Hamilton
Linda Hamilton原创
2024-11-01 12:00:04385浏览

  Why is Java 8's Lambda Approach the Best Way to Sort Objects with Multiple Fields?

使用 Java 8 lambda(2019 年 4 月 10 日添加)

此版本的代码利用 Java 8 lambda 来达到想要的排序结果:

<code class="java">Collections.sort(reportList, Comparator.comparing(Report::getReportKey)
            .thenComparing(Report::getStudentNumber)
            .thenComparing(Report::getSchool));</code>

这里的关键是使用 thenComparing 方法创建一个比较器链。链中的每个比较器都会比较报表对象中的字段之一。然后使用生成的比较器对列表进行排序。

这种方法简洁、易于阅读且类型安全。它还具有延迟计算 getter 的优点,这意味着只有在需要比较时才会调用 getter。

凌乱且费解:手动排序

原始代码是手工排序的,冗长且容易出错。需要大量的打字和维护,而且在编写比较逻辑时很容易出错。如下所示:

<code class="java">Collections.sort(reportList, new Comparator<Report>() {

  @Override
  public int compare(Report record1, Report record2) {
    return (record1.getReportKey() + record1.getStudentNumber() + record1.getSchool())                      
        .compareTo(record2.getReportKey() + record2.getStudentNumber() + record2.getSchool());
  }

});</code>

不建议对具有多个字段的对象进行排序。

反射方式:使用 BeanComparator 排序

BeanComparator 方法使用反射来比较 Report 对象的字段。这种方法比手工排序更简洁,但也更容易出错且速度较慢。它看起来像这样:

<code class="java">ComparatorChain chain = new ComparatorChain(Arrays.asList(
   new BeanComparator("reportKey"),
   new BeanComparator("studentNumber"),
   new BeanComparator("school")));

Collections.sort(reportList, chain);  </code>

不建议使用此方法对具有多个字段的对象进行排序。

实现方法:使用 Google Guava 的 ComparisonChain 进行排序

Google Guava ComparisonChain 方法与 BeanComparator 方法类似,但它更灵活、更快。它看起来像这样:

<code class="java">Collections.sort(reportList, new Comparator<Report>() {  

  @Override  
  public int compare(Report p1, Report p2) {  
    return ComparisonChain.start().compare(p1.getReportKey(), p2.getReportKey()).compare(p1.getStudentNumber(), p2.getStudentNumber()).compare(p1.getSchool(), p2.getSchool()).result();  
  }  
});  </code>

这种方法是对具有多个字段的对象进行排序的不错选择,但它不如 Java 8 lambda 方法那么简洁。

;使用 Apache Commons CompareToBuilder 排序

Apache Commons CompareToBuilder 方法类似于 Google Guava ComparisonChain 方法,但灵活性较差。它看起来像这样:

<code class="java">Collections.sort(reportList, new Comparator<Report>() {  

  @Override  
  public int compare(Report p1, Report p2) {  
    return new CompareToBuilder().append(p1.getReportKey(), p2.getReportKey()).append(p1.getStudentNumber(), p2.getStudentNumber()).append(p1.getSchool(), p2.getSchool()).toComparison();  
  }  
});  </code>

这种方法是对具有多个字段的对象进行排序的不错选择,但它不如 Java 8 lambda 方法那么简洁。

;因此

最终,对具有多个字段的对象进行排序的最佳方法取决于应用程序的具体要求。 Java 8 lambda 方法是最简洁且类型安全的,但它需要 Java 8 或更高版本。对于需要比 Java 8 lambda 方法更多灵活性的应用程序来说,Google Guava ComparisonChain 方法是一个不错的选择,但它并不那么简洁。对于需要比 Google Guava ComparisonChain 方法更少灵活性的应用程序来说,Apache Commons CompareToBuilder 方法是一个不错的选择,但它不够简洁。

以上是为什么 Java 8 的 Lambda 方法是对具有多个字段的对象进行排序的最佳方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn