Rumah >Java >javaTutorial >Mengapakah Pendekatan Lambda Java 8 Cara Terbaik untuk Mengisih Objek dengan Pelbagai Medan?
Versi kod ini memanfaatkan Java 8 lambda untuk mencapai hasil pengisihan yang diingini:
<code class="java">Collections.sort(reportList, Comparator.comparing(Report::getReportKey) .thenComparing(Report::getStudentNumber) .thenComparing(Report::getSchool));</code>
Kunci di sini ialah menggunakan kaedah thenComparing untuk mencipta rantaian pembanding. Setiap pembanding dalam rantai membandingkan salah satu medan dalam objek Laporan. Pembanding yang terhasil kemudiannya digunakan untuk mengisih senarai.
Pendekatan ini ringkas, mudah dibaca dan selamat menaip. Ia juga mempunyai kelebihan malas menilai getter, bermakna getter hanya dipanggil apabila ia diperlukan untuk perbandingan.
Kod asal, yang diisih menggunakan tangan, adalah verbose dan mudah ralat. Ia memerlukan banyak menaip dan penyelenggaraan, dan ia adalah mudah untuk membuat kesilapan semasa menulis logik perbandingan. Begini rupanya:
<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>
Pendekatan ini tidak disyorkan untuk mengisih objek dengan berbilang medan.
Pendekatan BeanComparator menggunakan refleksi untuk membandingkan medan objek Laporan. Pendekatan ini lebih ringkas daripada menyusun dengan tangan, tetapi ia juga lebih mudah ralat dan lebih perlahan. Begini rupanya:
<code class="java">ComparatorChain chain = new ComparatorChain(Arrays.asList( new BeanComparator("reportKey"), new BeanComparator("studentNumber"), new BeanComparator("school"))); Collections.sort(reportList, chain); </code>
Pendekatan ini tidak disyorkan untuk mengisih objek dengan berbilang medan.
Pendekatan Google Guava ComparisonChain adalah serupa dengan pendekatan BeanComparator, tetapi ia lebih fleksibel dan lebih pantas. Begini rupanya:
<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>
Pendekatan ini ialah pilihan yang baik untuk mengisih objek dengan berbilang medan, tetapi ia tidak seringkas pendekatan Java 8 lambda.
Pendekatan Apache Commons CompareToBuilder adalah serupa dengan pendekatan Google Guava ComparisonChain, tetapi ia kurang fleksibel. Begini rupanya:
<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>
Pendekatan ini ialah pilihan yang baik untuk mengisih objek dengan berbilang medan, tetapi ia tidak seringkas pendekatan Java 8 lambda.
Akhirnya, pendekatan terbaik untuk mengisih objek dengan berbilang medan bergantung pada keperluan khusus aplikasi. Pendekatan lambda Java 8 adalah yang paling ringkas dan selamat jenis, tetapi ia memerlukan Java 8 atau lebih baru. Pendekatan Google Guava ComparisonChain ialah pilihan yang baik untuk aplikasi yang memerlukan lebih banyak fleksibiliti daripada pendekatan Java 8 lambda, tetapi ia tidak begitu ringkas. Pendekatan Apache Commons CompareToBuilder ialah pilihan yang baik untuk aplikasi yang memerlukan kurang fleksibiliti daripada pendekatan Google Guava ComparisonChain, tetapi ia tidak begitu ringkas.
Atas ialah kandungan terperinci Mengapakah Pendekatan Lambda Java 8 Cara Terbaik untuk Mengisih Objek dengan Pelbagai Medan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!