此版本的程式碼利用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中文網其他相關文章!