2016-04-01 17 views
12

Tôi đang sử dụng tính năng này để lấy mục mới nhất. Làm thế nào tôi có thể nhận được điều này là không an toàn và sắp xếp với ngày null cuối cùng (cũ nhất). createDt là một đối tượng localDate của joda.So sánh ngày tháng an toàn cho việc phân loại trong Java 8 Stream

Optional<Item> latestItem = items.stream() 
          .sorted((e1, e2) -> e2.getCreateDt().compareTo(e1.getCreateDt())) 
          .findFirst(); 
+2

Tôi không biết chính xác bạn sẽ làm như thế nào với lambdas nhưng chúng tôi đang sử dụng phương pháp so sánh chung cho điều đó, tức là nó có thể giống như '(e1, e2) -> compareNullable (e2.getCreateDt() , e1.getCreateDt()) 'trong trường hợp của bạn (bạn phải cung cấp phương thức' compareNullable (T, T) 'ở đâu đó). – Thomas

Trả lời

22

Nếu đó là Item s có thể được null, giải pháp sử dụng @ rgettman của.

Nếu đó là LocalDate s có thể được null, sử dụng này:

items.stream() 
    .sorted(Comparator.comparing(Item::getCreateDt, Comparator.nullsLast(Comparator.reverseOrder()))); 

Trong cả hai trường hợp, lưu ý rằng sorted().findFirst() có khả năng là không hiệu quả vì hầu hết các triển khai tiêu chuẩn sắp xếp toàn bộ dòng đầu tiên. Bạn nên sử dụng Stream.min để thay thế.

12

Bạn có thể bật null-không an toàn Comparator thành một null-an toàn bằng cách gói nó Comparator.nullsLast của riêng bạn. (Có một số Comparator.nullsFirst cũng có.)

Trả về so sánh không thân thiện với số tiền xem xét null để lớn hơn không null. Khi cả hai đều là null, chúng được coi là bằng nhau. Nếu cả hai đều không có giá trị null, thì chỉ định Comparator được chỉ định để xác định thứ tự.

.sorted(Comparator.nullsLast(
    (e1, e2) -> e2.getCreateDt().compareTo(e1.getCreateDt()))) 
.findFirst(); 
+1

Tại sao bạn không sử dụng 'Comparator.comparing'? –

+2

@LouisWasserman Trong khi bạn chắc chắn có thể sử dụng 'Comparator.comparing', tôi đang tìm cách giải quyết vấn đề trước mắt. Câu trả lời của Paul là tốt hơn anyway, vì vậy tôi upvoted nó. – rgettman