JAVA 8 trở lên Trả lời (Sử dụng Biểu thức Lambda)
Trong Java 8, các biểu thức Lambda đã được giới thiệu để làm cho điều này thậm chí còn dễ dàng hơn! Thay vì tạo một đối tượng so sánh () với tất cả các giàn giáo của nó, bạn có thể đơn giản hóa nó như sau: (Sử dụng đối tượng của bạn làm ví dụ)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
hoặc thậm chí ngắn hơn:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Đó là một tuyên bố tương đương như sau:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Hãy nghĩ về các biểu thức Lambda như chỉ yêu cầu bạn đưa vào các phần có liên quan của mã: chữ ký phương thức và những gì được trả về.
Một phần khác của câu hỏi của bạn là làm thế nào để so sánh với nhiều lĩnh vực. Để làm điều đó với các biểu thức Lambda, bạn có thể sử dụng .thenComparing()
hàm để kết hợp hiệu quả hai phép so sánh thành một:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
Đoạn mã trên sẽ sắp xếp danh sách trước timeStarted
, sau đó theo timeEnded
(đối với những bản ghi có cùng timeStarted
).
Một lưu ý cuối cùng: Thật dễ dàng để so sánh các nguyên thủy 'dài' hoặc 'int', bạn chỉ có thể trừ đi cái khác. Nếu bạn đang so sánh các đối tượng ('Dài' hoặc 'Chuỗi'), tôi khuyên bạn nên sử dụng so sánh tích hợp của chúng. Thí dụ:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDIT: Cảm ơn Lukas Eder đã chỉ cho tôi .thenComparing()
hoạt động.