使用stream流多字段排序SpringBoot
前言
在开发过程中我们经常会遇到根据对象中不同字段的值进行排序,也就是我们常说的多字段排序。
在Java8中我们可以使用stream流很便捷的进行排序。
下面我将以年龄和班级两个字段的值来演示使用stream流进行多字段排序的操作。
数据准备
public class User {
//学生id
private Integer userId;
//学生姓名
private String userName;
//学生年龄
private Integer age;
//学生班级
private Integer classNo;
}
List<User> userList = new ArrayList<>();
userList.add(new User(1, "shy01", 20, 1));
userList.add(new User(2, "shy02", 18, 3));
userList.add(new User(3, "shy03", 20, 4));
userList.add(new User(4, "shy04", 19, 2));
userList.add(new User(5, "shy05", 17, 5));
userList.add(new User(6, "shy06", 16, 4));
userList.add(new User(7, "shy07", 18, 9));
userList.add(new User(8, "shy08", 19, 8));
userList.add(new User(9, "shy09", 21, 7));
字段排序
1、单个字段排序
1.1根据年龄升序排序
userList = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList()); userList.forEach(System.out::println);

1.2根据年龄降序排序
//方法1:先对年龄进行升序,结果进行反转 userList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList()); //方法2:直接对年龄进行降序 userList = userList.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder())).collect(Collectors.toList()); userList.forEach(System.out::println);

2、多个字段排序
2.1年龄升序,班级升序
userList = userList.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getClassNo)).collect(Collectors.toList());

2.2年龄降序,班级升序
//方法1:先对年龄进行升序,升序结果进行反转,再进行班级升序 userList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getClassNo)).collect(Collectors.toList()); //方法2:直接对年龄进行降序,再对班级进行升序 userList = userList.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder()).thenComparing(User::getClassNo)).collect(Collectors.toList());

2.3年龄降序,班级降序
//方法1:先对年龄进行升序,升序结果进行反转,再对班级进行降序 userList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getClassNo, Comparator.reverseOrder())).collect(Collectors.toList()); //方法2:直接对年龄进行降序,再对班级进行降序 userList = userList.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder()).thenComparing(User::getClassNo, Comparator.reverseOrder())).collect(Collectors.toList()); //方式3:先对年龄进行升序,再对班级进行升序,最后对结果进行反转 userList = userList.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getClassNo).reversed()).collect(Collectors.toList());

2.4年龄升序,班级降序
//方法1:先对年龄进行升序,升序结果进行反转,再进行班级升序,结果进行反转(有点绕,年龄被排了三次升-降-升) userList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getClassNo).reversed()).collect(Collectors.toList()); //方法2:直接对年龄进行升序,再对班级进行降序 userList = userList.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getClassNo, Comparator.reverseOrder())).collect(Collectors.toList());

总结
如果只进行单个字段的升序降序排列,我们使用reversed() 或者 Comparator.reverseOrder() 都可以
如果要进行多个字段的升序降序排列,我们还是使用 Comparator.reverseOrder() 会更优雅、更好理解一些。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
java.net.UnknownHostException异常的一般原因及解决步骤
关于java.net.UnknownHostException大家也许都比较熟悉,这篇文章主要给大家介绍了关于java.net.UnknownHostException异常的一般原因及解决步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下2024-02-02
idea maven编译报错Java heap space的解决方法
这篇文章主要为大家详细介绍了idea maven编译报错Java heap space的相关解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下2025-04-04
Java matches类,Pattern类及matcher类用法示例
这篇文章主要介绍了Java matches类,Pattern类及matcher类用法,结合实例形式分析了java matches类,Pattern类及matcher类针对字符串常见操作技巧与相关注意事项,需要的朋友可以参考下2019-03-03
Spring过滤器中OncePerRequestFilter应用实现
OncePerRequestFilter是Spring框架提供的一个过滤器基类,本文就来介绍一下Spring过滤器中OncePerRequestFilter应用实现,感兴趣的可以了解一下2024-12-12


最新评论