当列表中有空值时,如何使用流获取最大日期列表

How to get max of dates list with stream, when having nulls in list

我有以下代码:

List<LocalDate> dates = Arrays.asList(null, null, 
    LocalDate.now(), LocalDate.now().minusDays(9));

LocalDate max = dates.stream()
    .max(Comparator.nullsLast(Comparator.naturalOrder())).get();

当我尝试获取最大值时产生空指针异常,但当我尝试获取最小值时它工作正常。似乎不清楚原因 max 采用 Comparator 来处理空值。如何使用保留空值的流对此类数组进行排序。

顺便说一下,我查看了 max 的 JavaDoc,其中指出:

@throws NullPointerException if the maximum element is null

编辑:

LocalDate max = dates.stream()
    .max(Comparator.nullsLast(Comparator.naturalOrder())).orElse(null);

也抛出空指针。

List 中有 null 个值并寻找最大值?首先使用 Stream::filter 删除 null 值。那么工作就简单了:

LocalDate max = dates.stream()
                     .filter(Objects::nonNull)
                     .max(Comparator.naturalOrder()).get();

如果您坚持只使用 Comparator,请改用 Comparator::nullsFirst

LocalDate max = dates.stream().max(Comparator.nullsFirst(Comparator.naturalOrder())).get();

如果您希望答案是 null 因为它包含一个您可以自己减少。

List<LocalDate> dates = Arrays.asList(null, null,
        LocalDate.now(), LocalDate.now().minusDays(9));

LocalDate max = dates.stream()
        .reduce(LocalDate.MIN,
                BinaryOperator.maxBy(Comparator.nullsLast(Comparator.naturalOrder())));
System.out.println(max);

打印

null

注意:这与空列表 returns LocalDate.MIN.

的意义不同

一个不太明显的选择是将 null 替换为 LocalDate.MAX 假设它从未被使用过。

LocalDate max = dates.stream()
        .map(d -> d == null ? LocalDate.MAX : d)
        .max(Comparator.naturalOrder())
        .map(d -> LocalDate.MAX.equals(d) ? null : d)
        .orElse(null);

此 returns null 为空列表。