Rumah >Java >javaTutorial >Mengapakah Pendekatan Lambda Java 8 Cara Terbaik untuk Mengisih Objek dengan Pelbagai Medan?

Mengapakah Pendekatan Lambda Java 8 Cara Terbaik untuk Mengisih Objek dengan Pelbagai Medan?

Linda Hamilton
Linda Hamiltonasal
2024-11-01 12:00:04399semak imbas

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

Menggunakan Java 8 lambda (ditambah pada 10 April 2019)

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.

Kucar-kacir dan berbelit-belit: Menyusun menggunakan tangan

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.

Cara reflektif: Isih dengan BeanComparator

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.

Sampai ke sana: Isih dengan ComparisonChain Google Guava

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn