使用 list.stream.sorted() 不会改变原集合,接收的返回值才是排序之后的数据
1) 自然排序
list = list.stream.sorted().collect(Collectors.toList());
2) 自然排序,降序(注:集合对象必须实现Comparable接口)
list = list.stream.sorted(Comparator.reverseOrder()).collect(Collectors.toList());
3) 按某个字段排序,比如Student类中的name
list = list.stream.sorted(Comparator.comparing(Student::getName)).collect(Collectors.toList());
4) 按某个字段排序,降序,比如Student类中的name
list = list.stream.sorted(Comparator.comparing(Student::getName).reversed()).collect(Collectors.toList());
5) 按多个字段排序,比如Student类中的name,age
list = list.stream.sorted(Comparator.comparing(Student::getName).thenComparing(Student::getAge)).collect(Collectors.toList);
6) 解决排序字段数据为null时报错
a. 数据为null时排序在最前
list = list.stream.sorted(Comparator.comparing(Student::getName), Comparator.nullsFirst(String::compareTo)).collect(Collectors.toList());
b. 数据为null时排序在最后
list = list.stream.sorted(Comparator.comparing(Student::getName), Comparator.nullsLast(String::compareTo)).collect(Collectors.toList());
总结:
自然排序
stream.sorted();
降序(排序对象需实现Comparable接口)
Comparator.reverseOrder()
字段排序
Comparator.comparing(Student::getName)
字段降序
Comparator.comparing(Student::getName).reversed()
多字段排序(先···再···)
Comparator.comparing(Student::getName).thenComparing(Student::getAge)
排序字段为null处理,不处理为null会报空指针
Comparator.nullsLast() // 为null排序在后
Comparator.nullsFirst() //为null排序在前
例如:
Comparator.comparing(Student::getName), Comparator.nullsLast(String::compareTo))
注:nullsLast() 和 nullsFirst() 中需要传参,参数为排序字段对应类型的comparTo方法;
注:上述字段排序方法可以自由组合,比如多字段排序时,第一个字段升序,为null数据在最后;第二个字段降序,为null数据在最前。