原本在开发时自己常用的排序方法如下
Collections.sort(industAddValueList);
Collections.reverse(industAddValueList);
但是这种方法对于null来说并不友好,如果没有数据的时候,经常会发生All elements are null的异常问题。这种情况对list本身进行判断都不能过滤掉,就像下图一样:失败的判断三连。
面向百度后,在原来的基础上进行了修改,增加了 Comparator.nullsLast() 方法,用一行代码就可以替代最开始的两行代码,并且不再会抛出异常问题了。
Collections.sort(industAddValueList,Comparator.nullsLast(Comparator.reverseOrder()));
①
Comparator.reverseOrder() //返回一个与自然排序相反的比较器
相似的:reversed() //返回一个比较器,强制该比较器的相反顺序
相反的:Comparator.naturalOrder() //返回自然排序的比较器
②
Comparator.nullsLast() //当集合中存在null元素时,可以使用针对null友好的比较器,null元素排在集合的最后面
相反的:Comparator.nullsFirst() //null元素排在集合的最前面
③
当上面两种比较器嵌套使用时的执行顺序说明
public static void main(String[] args) {
Student student1 = new Student("zhangsan", 1, 80);
Student student2 = new Student("lisi", null, 90);
Student student3 = new Student("wangwu", 2, 100);
List<Student> list = new ArrayList<>();
list.add(student1);
list.add(student2);
list.add(student3);
//按照age进行降序排列,再将key为null的排到最后面
Comparator<Student> comparator = Comparator.comparing(Student::getAge,Comparator.nullsLast(Comparator.reverseOrder()));
Collections.sort(list, comparator);
//按照age进行自然顺序(正序)排列,再将key为null的排再最前面
Comparator<Student> comparator = Comparator.comparing(Student::getAge,Comparator.nullsFirst(Comparator.naturalOrder()));
Collections.sort(list, comparator);
}
④其他注意事项
如果多个key都为null的话,那将无法保证这几个对象的排序
Boolean类型的排序默认规则是false排在前面,而true排在后面
由于 null 不是一个类,也不是一个对象,因此在重写 compareTo 方法时应该注意 e.compareTo(null) 的情况,即使 e.equals(null) 返回 false,compareTo 方法也应该主动抛出一个空指针异常 NullPointerException。
参考链接:
深入学习java源码之Comparator.reverseOrder()与Comparator.compare ()