当列表中有空值时,如何使用流获取最大日期列表
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();
Comparator::nullsFirst
returns 一个 null 友好比较器,认为 null 小于非 null。
Comparator::nullsLast
returns 一个 null 友好的比较器,认为 null 大于非 null。
如果您希望答案是 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
为空列表。
我有以下代码:
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();
Comparator::nullsFirst
returns 一个 null 友好比较器,认为 null 小于非 null。Comparator::nullsLast
returns 一个 null 友好的比较器,认为 null 大于非 null。
如果您希望答案是 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
为空列表。