2015-11-02 30 views
18

Cách ngắn gọn nhất để thực hiện việc này là gì?java 8, Sắp xếp danh sách các đối tượng theo thuộc tính mà không cần so sánh tùy chỉnh

class AnObject{ 
    Long attr; 
} 

List<AnObject> list; 

Tôi biết nó có thể được thực hiện với bộ so sánh tùy chỉnh cho AnObject. Không có cái gì đó sẵn sàng ra khỏi hộp cho trường hợp như vậy? loại

Collections.sort(list, X.attr) ; 
+1

Bạn có nhìn javadoc của lớp so sánh? Họ đã thêm một loạt các phương thức (và bạn có thể trực tiếp làm 'list1.sort (..)' bằng cách này). –

Trả lời

51

Giả sử bạn thực sự có một List<AnObject>, tất cả bạn cần là

list.sort(Comparator.comparing(a -> a.attr)); 

Nếu bạn làm cho bạn mã sạch bằng cách không sử dụng các lĩnh vực công cộng, nhưng phương pháp accessor, nó trở nên sạch hơn:

list.sort(Comparator.comparing(AnObject::getAttr)); 
+0

Điều gì xảy ra nếu attr là null? – Alex

+0

Kiểm tra và bạn sẽ biết. –

1

là một bổ sung cho câu trả lời @JB Nizet, nếu attr của bạn là nullable,

list.sort(Comparator.comparing(AnObject::getAttr)); 

có thể ném NPE.

Nếu bạn cũng muốn sắp xếp các giá trị null, bạn có thể xem xét

list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsFirst(Comparator.naturalOrder()))); 

hoặc

list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsLast(Comparator.naturalOrder()))); 

mà sẽ đưa null đầu tiên hoặc cuối cùng.

0

Một lựa chọn null-an toàn để của JB Nizet và câu trả lời của Alex ở trên sẽ được thực hiện như sau:

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsFirst(Comparator.naturalOrder()))); 

hoặc

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsLast(Comparator.naturalOrder()))); 
Các vấn đề liên quan