ホームページ >Java >&#&チュートリアル >Java 8 の Lambda アプローチが、複数のフィールドを持つオブジェクトを並べ替える最適な方法であるのはなぜですか?
このバージョンのコードは、Java 8 ラムダを利用して、目的の並べ替え結果を実現します:
<code class="java">Collections.sort(reportList, Comparator.comparing(Report::getReportKey) .thenComparing(Report::getStudentNumber) .thenComparing(Report::getSchool));</code>
ここで重要なのは、thenComparing メソッドを使用してコンパレータのチェーンを作成することです。チェーン内の各コンパレーターは、Report オブジェクト内のフィールドの 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>手動で並べ替える元のコードは冗長でエラーが発生しやすくなります。多くの入力とメンテナンスが必要となり、比較ロジックを作成するときに間違いを犯しやすくなります。
このアプローチは、複数のフィールドを持つオブジェクトを並べ替える場合には推奨されません。
<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 オブジェクトのフィールドを比較します。このアプローチは手動で並べ替えるよりも簡潔ですが、エラーが発生しやすく、時間がかかります。
このアプローチは、複数のフィールドを持つオブジェクトを並べ替える場合には推奨されません。
<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 サイトの他の関連記事を参照してください。