คำตอบ JAVA 8 ขึ้นไป (การใช้แลมบ์ดานิพจน์)
ใน Java 8 นิพจน์แลมบ์ดาถูกนำมาใช้เพื่อทำให้สิ่งนี้ง่ายยิ่งขึ้น! แทนที่จะสร้างวัตถุ Comparator () พร้อมนั่งร้านทั้งหมดคุณสามารถทำให้มันง่ายขึ้นดังนี้: (ใช้วัตถุเป็นตัวอย่าง)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
หรือสั้นกว่า:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
คำสั่งเดียวนั้นเทียบเท่ากับสิ่งต่อไปนี้:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
ลองนึกถึงการแสดงออกของแลมบ์ดาว่าให้คุณใส่เฉพาะในส่วนที่เกี่ยวข้องของรหัส: ลายเซ็นวิธีการและสิ่งที่ได้รับคืน
อีกคำถามหนึ่งของคุณคือวิธีเปรียบเทียบกับหลาย ๆ ฟิลด์ ในการทำเช่นนั้นกับนิพจน์แลมบ์ดาคุณสามารถใช้.thenComparing()
ฟังก์ชันเพื่อรวมการเปรียบเทียบสองรายการเข้าด้วยกันเป็นหนึ่งเดียวได้อย่างมีประสิทธิภาพ:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
รหัสด้านบนจะเรียงลำดับรายการเป็นลำดับแรกจากtimeStarted
นั้นตามด้วยtimeEnded
(สำหรับระเบียนที่มีเหมือนกันtimeStarted
)
หมายเหตุสุดท้ายหนึ่ง: มันเป็นการง่ายที่จะเปรียบเทียบแบบดั้งเดิม 'long' หรือ 'int' คุณสามารถลบอันใดอันหนึ่งจากอีกอันหนึ่งได้ หากคุณกำลังเปรียบเทียบวัตถุ ('ยาว' หรือ 'สตริง') ฉันขอแนะนำให้คุณใช้การเปรียบเทียบในตัว ตัวอย่าง:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
แก้ไข: ขอบคุณ Lukas Eder สำหรับการชี้ให้ฉัน.thenComparing()
ทำงาน