假设您有一个包含空值的整数列表
List<Integer> integers = Arrays.asList(null, 9, 11, 7, 5, null);
现在,如果您想获得最大价值,可以尝试
OptionalInt max = integers.stream()
.mapToInt(Integer::valueOf)
.max();
如果列表不包含空值,这将起作用。在我们的例子中,将有一个NullPointerException。经过研究,我可以看到这样的解决方案
Optional<Integer> max = integers.stream()
.max(Comparator.nullsFirst(Comparator.naturalOrder()));
如果您认为空值小于非空值,则可以使用它。但是,如果您希望它们更大,则将nullsFirst更改为nullsLast
Optional<Integer> max = integers.stream()
.max(Comparator.nullsLast(Comparator.naturalOrder()));
那么您将再次遇到NullPointerException。
我很有趣-考虑到其文档指出它是null友好的,为什么nullsLast在这种情况下不起作用?
排序包含空值的整数列表的最佳方法是什么?
感谢您的想法!
最佳答案
Stream#max
的文档指出:
抛出:NullPointerException-如果最大元素为null
当您提供了一个将null
视为最大元素的比较器时,这就是为什么它引发异常的原因。
这就是stacktrace在尝试返回Optional.of(state);
为state
的示例中返回null
时的指示,如果传递的值为Optional.of
,则null
会引发NPE。Comparator.nullsLast
可以正常工作,例如:
Integer max =
Collections.max(integers, Comparator.nullsLast(Comparator.naturalOrder()));
确实会给你
null
。