2014-10-26 79 views
28

Ồ, những dòng Java 8 phức tạp này có lambdas. Họ rất mạnh mẽ, nhưng những phức tạp mất một chút để quấn đầu của một người xung quanh tất cả.Sắp xếp theo thuộc tính trong dòng Java 8

Giả sử tôi có loại User với thuộc tính User.getName(). Giả sử tôi có bản đồ của những người dùng đó Map<String, User> được liên kết với tên (ví dụ như tên người dùng đăng nhập). Hãy tiếp tục nói rằng tôi có một thể hiện của một so sánh UserNameComparator.INSTANCE để sắp xếp tên người dùng (có lẽ với các trình thu thập ưa thích và như vậy).

Vậy làm cách nào để có danh sách người dùng trên bản đồ, được sắp xếp theo tên người dùng? Tôi có thể bỏ qua các phím bản đồ và thực hiện điều này:

return userMap.values() 
    .stream() 
    .sorted((u1, u2) -> { 
     return UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName()); 
    }) 
    .collect(Collectors.toList()); 

Nhưng đó dòng nơi tôi phải trích xuất các tên để sử dụng các UserNameComparator.INSTANCE có vẻ như công việc chân tay quá nhiều. Có cách nào tôi có thể chỉ đơn giản là cung cấp User::getName như một số chức năng lập bản đồ, chỉ để phân loại, và vẫn nhận được các trường hợp User trở lại trong danh sách thu thập?

Phần thưởng: Điều gì sẽ xảy ra nếu điều tôi muốn sắp xếp là hai cấp độ sâu, chẳng hạn như User.getProfile().getUsername()?

Trả lời

51

gì bạn muốn là Comparator#comparing:

userMap.values().stream() 
    .sorted(Comparator.comparing(User::getName, UserNameComparator.INSTANCE)) 
    .collect(Collectors.toList()); 

Đối với phần thứ hai của câu hỏi của bạn, bạn sẽ chỉ cần sử dụng

Comparator.comparing(
    u->u.getProfile().getUsername(), 
    UserNameComparator.INSTANCE 
) 
+0

Wow, bộ não của tôi gần như đau, nhưng đó là chính xác những gì tôi đang tìm kiếm cho, tiền thưởng và tất cả mọi thứ! Và phản ứng cực nhanh. Cảm ơn! –

Các vấn đề liên quan