美文网首页
实现Java stream 实现自定义排序

实现Java stream 实现自定义排序

作者: 无与凡想 | 来源:发表于2023-04-24 10:51 被阅读0次

使用 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数据在最前。

相关文章

网友评论

      本文标题:实现Java stream 实现自定义排序

      本文链接:https://www.haomeiwen.com/subject/nglujdtx.html