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();