JAVA 8 dan Jawaban Di Atas (Menggunakan Ekspresi Lambda)
Di Java 8, ekspresi Lambda diperkenalkan untuk membuat ini lebih mudah! Alih-alih membuat objek Comparator () dengan semua perancahnya, Anda dapat menyederhanakannya sebagai berikut: (Menggunakan objek Anda sebagai contoh)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
atau bahkan lebih pendek:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Satu pernyataan itu setara dengan yang berikut:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Pikirkan ekspresi Lambda sebagai hanya mengharuskan Anda untuk memasukkan bagian yang relevan dari kode: tanda tangan metode dan apa yang dikembalikan.
Bagian lain dari pertanyaan Anda adalah bagaimana membandingkan beberapa bidang. Untuk melakukannya dengan ekspresi Lambda, Anda dapat menggunakan .thenComparing()
fungsi untuk secara efektif menggabungkan dua perbandingan menjadi satu:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
Kode di atas akan mengurutkan daftar berdasarkan timeStarted
, dan kemudian oleh timeEnded
(untuk catatan yang memiliki yang sama timeStarted
).
Satu catatan terakhir: Sangat mudah untuk membandingkan primitif 'panjang' atau 'int', Anda dapat mengurangi satu dari yang lainnya. Jika Anda membandingkan objek ('Panjang' atau 'Tali'), saya sarankan Anda menggunakan perbandingan bawaannya. Contoh:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDIT: Terima kasih kepada Lukas Eder karena menunjuk saya .thenComparing()
berfungsi.