Sorting Java 8-带null的整数排序列表

Sorting Java 8-带null的整数排序列表,sorting,null,java-8,Sorting,Null,Java 8,假设您有一个包含空值的整数列表 List<Integer> integers = Arrays.asList(null, 9, 11, 7, 5, null); 如果列表中不包含空值,这将起作用。在我们的例子中,将出现NullPointerException。经过一些研究,我可以看到这样的解决方案 Optional<Integer> max = integers.stream() .max(Comparator.nullsFirst(Comparator

假设您有一个包含空值的整数列表

List<Integer> integers = Arrays.asList(null, 9, 11, 7, 5, null);
如果列表中不包含空值,这将起作用。在我们的例子中,将出现NullPointerException。经过一些研究,我可以看到这样的解决方案

Optional<Integer> max = integers.stream()
        .max(Comparator.nullsFirst(Comparator.naturalOrder()));
可选max=integers.stream()
.max(Comparator.nullsFirst(Comparator.naturalOrder());
如果你认为空值小于非空值,它就起作用了。但如果您希望它们更大,并将nullsFirst更改为nullsLast

Optional<Integer> max = integers.stream()
        .max(Comparator.nullsLast(Comparator.naturalOrder()));
可选max=integers.stream()
.max(Comparator.nullsLast(Comparator.naturalOrder());
然后您将再次遇到NullPointerException

我很感兴趣-考虑到它的文档声明它是空友好的,为什么nullsLast在这种情况下不工作? 对包含空值的整数列表进行排序的最佳方法是什么

谢谢你的想法

国家文件:

抛出:NullPointerException-如果最大元素为null

当您提供了一个比较器,它将考虑<代码> null >代码>作为最大元素,这就是它抛出异常的原因。

这是stacktrace试图返回
Optional.of(状态)时所指示的state
null
,并且
可选。如果传递的值为
null
,of
将抛出NPE

Comparator.nullsLast
工作正常,例如:

Integer max = 
    Collections.max(integers, Comparator.nullsLast(Comparator.naturalOrder()));

将确实为您提供
null
,这与
比较器本身无关:

List<Integer> result = integers.stream()
            .sorted(Comparator.nullsLast(Comparator.naturalOrder()))
            .collect(Collectors.toList());
System.out.println(result); // [5, 7, 9, 11, null, null]
List result=integers.stream()
.sorted(Comparator.nullsLast(Comparator.naturalOrder()))
.collect(Collectors.toList());
System.out.println(结果);//[5,7,9,11,空,空]

您正在将空值放在末尾,这将是
max
;对null调用
max
会抛出
NullPointerException

> P > >如果考虑<代码> null <代码>大于任何非代码> null <代码>值,则最大值当然是<代码> null <代码>列表中包含任何<代码> null < /> >

由于已经记录了当结果为
null
时它将抛出
NullPointerException
,因此这是预期的行为。设计原理类似于中讨论的
findFirst()

注意,即使

Optional<Integer> max = integers.stream()
    .max(Comparator.nullsFirst(Comparator.naturalOrder()));

当您得到一个空的
optionant
时,您仍然可以测试
integers.isEmpty()
,以确定所有元素是
空的还是根本没有元素。

请考虑更改此问题的名称。这与分类无关,是吗?
Optional<Integer> max = integers.stream()
    .max(Comparator.nullsFirst(Comparator.naturalOrder()));
OptionalInt max = integers.stream()
    .filter(Objects::nonNull)
    .mapToInt(Integer::valueOf)
    .max();