【问题标题】:Null safe date comparator for sorting in Java 8 Stream用于在 Java 8 Stream 中排序的空安全日期比较器
【发布时间】:2016-04-01 16:19:39
【问题描述】:

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

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

【问题讨论】:

  • 我不知道你会如何使用 lambdas 但我们为此使用了通用比较方法,即在你的情况下它可能类似于 (e1, e2) -&gt; compareNullable( e2.getCreateDt(), e1.getCreateDt())(你会必须在某处提供compareNullable(T,T) 方法)。

标签: java java-8 java-stream


【解决方案1】:

如果Items 可能为空,请使用@rgettman 的解决方案。

如果LocalDates 可能为空,请使用:

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

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

【讨论】:

  • 是否有相反的替代方案?这让我很困惑。
  • @RyanTheLeach:当然,那是Comparator.naturalOrder()
【解决方案2】:

您可以将自己的 null 不安全 Comparator 包装成一个 null 安全的 Comparator.nullsLast。 (还有一个Comparator.nullsFirst。)

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

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

【讨论】:

  • 你为什么不使用Comparator.comparing
  • @LouisWasserman 虽然您当然可以使用Comparator.comparing,但我希望解决眼前的问题。无论如何,保罗的答案更好,所以我投了赞成票。
  • NullPointerException 将被抛出,当 e2.getCreateDt() == null
  • 这有助于 e1e2 为 null,但在 getCreatedTt() 返回 null 时无效
猜你喜欢
  • 2017-09-28
  • 2019-04-10
  • 2020-02-24
  • 1970-01-01
  • 2022-07-02
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多