空安全日期比较器,用于在 Java 8 流中排序

2022-08-31 15:50:08

我正在使用它来获取最新的项目。我怎样才能让它成为空安全,并用空日期最后(最旧)进行排序。createDt 是一个 joda LocalDate 对象。

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

答案 1

如果 s 可能为 null,请使用 @rgettman 的解决方案。Item

如果 s 可能为空,请使用:LocalDate

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

在任何一种情况下,请注意,这可能是低效的,因为大多数标准实现首先对整个流进行排序。您应该改用 Stream.minsorted().findFirst()


答案 2

你可以把自己的 null-unsafe 变成一个 null-safe,方法是将其包装成 Comparator.nullsLast。(还有一个。ComparatorComparator.nullsFirst

返回一个对 null 友好的比较器,该比较器认为大于非 null。当两者都是,它们被认为是相等的。如果两者都不为 null,则使用指定的值来确定顺序。nullnullComparator

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

推荐