此版本的代码利用 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 方法使用反射来比较 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 方法与 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 方法类似于 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中文网其他相关文章!