ホームページ > Java > &#&チュートリアル > Java 8 の Lambda アプローチが、複数のフィールドを持つオブジェクトを並べ替える最適な方法であるのはなぜですか?

Java 8 の Lambda アプローチが、複数のフィールドを持つオブジェクトを並べ替える最適な方法であるのはなぜですか?

Linda Hamilton
リリース: 2024-11-01 12:00:04
オリジナル
398 人が閲覧しました

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

Java 8 ラムダの使用 (2019 年 4 月 10 日追加)

このバージョンのコードは、Java 8 ラムダを利用して、目的の並べ替え結果を実現します:

<code class="java">Collections.sort(reportList, Comparator.comparing(Report::getReportKey)
            .thenComparing(Report::getStudentNumber)
            .thenComparing(Report::getSchool));</code>
ログイン後にコピー

ここで重要なのは、thenComparing メソッドを使用してコンパレータのチェーンを作成することです。チェーン内の各コンパレーターは、R​​eport オブジェクト内のフィールドの 1 つを比較します。結果のコンパレータはリストの並べ替えに使用されます。

このアプローチは簡潔で読みやすく、タイプセーフです。また、ゲッターを遅延評価するという利点もあります。つまり、ゲッターは比較に必要な場合にのみ呼び出されます。

煩雑で複雑: 手動による並べ替え

<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 を使用した並べ替え

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

Collections.sort(reportList, chain);  </code>
ログイン後にコピー
BeanComparator アプローチでは、リフレクションを使用して Report オブジェクトのフィールドを比較します。このアプローチは手動で並べ替えるよりも簡潔ですが、エラーが発生しやすく、時間がかかります。

このアプローチは、複数のフィールドを持つオブジェクトを並べ替える場合には推奨されません。

行き方: Google Guava の ComparisonChain を使用した並べ替え

<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>
ログイン後にコピー
Google Guava ComparisonChain アプローチは BeanComparator アプローチに似ていますが、より柔軟で高速です。これは次のようになります:

このアプローチは、複数のフィールドを持つオブジェクトを並べ替えるには良い選択ですが、Java 8 ラムダ アプローチほど簡潔ではありません。

<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>
ログイン後にコピー
による並べ替え Apache Commons CompareToBuilder のアプローチは、Google Guava ComparisonChain のアプローチに似ていますが、柔軟性に劣ります。これは次のようになります:

このアプローチは、複数のフィールドを持つオブジェクトを並べ替えるには良い選択ですが、Java 8 ラムダ アプローチほど簡潔ではありません。

最終的に、複数のフィールドを持つオブジェクトを並べ替える最適な方法は、アプリケーションの特定の要件によって異なります。 Java 8 ラムダ アプローチは最も簡潔でタイプセーフですが、Java 8 以降が必要です。 Google Guava ComparisonChain アプローチは、Java 8 ラムダ アプローチよりも柔軟性が必要なアプリケーションに適していますが、それほど簡潔ではありません。 Apache Commons CompareToBuilder アプローチは、Google Guava ComparisonChain アプローチほど柔軟性を必要としないアプリケーションに適していますが、それほど簡潔ではありません。

以上がJava 8 の Lambda アプローチが、複数のフィールドを持つオブジェクトを並べ替える最適な方法であるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート