首頁 >Java >java教程 >為什麼 Java 8 的 Lambda 方法是對具有多個欄位的物件進行排序的最佳方法?

為什麼 Java 8 的 Lambda 方法是對具有多個欄位的物件進行排序的最佳方法?

Linda Hamilton
Linda Hamilton原創
2024-11-01 12:00:04441瀏覽

  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