• Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序


    Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序

    一、概述

            Java中集合排序,在Java8之前,可以通过 Collections类的sort方法进行排序;Java8之后,新增 lambda和stream ,都增加了相关的排序方法,本文将整理下常见的三种排序方法。

            分别是:

    • List 接口中的 sort 方法
    • Stream 接口中的 sorted 方法
    • Collections.sort 工具类方法

    二、准备工作

            1、创建一个User类,相关属性如下:

    1. public static class User{
    2. int id ;
    3. String name ;
    4. int age ;
    5. String addr ;
    6. public User(int id, String name, int age, String addr) {
    7. this.id = id;
    8. this.name = name;
    9. this.age = age;
    10. this.addr = addr;
    11. }
    12. // ignore getter/setter/toString
    13. }

            2、单元测试类,准备工作

    1. public class ListSortTest {
    2. List<User> userList = null;
    3. @Before
    4. public void init(){
    5. userList = Lists.newArrayList();
    6. userList.add(new User(1,"小明",22,"北京"));
    7. userList.add(new User(2,"小红",18,"上海"));
    8. userList.add(new User(3,"小花",22,"广州"));
    9. userList.add(new User(4,"小刚",33,"深圳"));
    10. System.out.println("原始数据是:"+userList);
    11. }
    12. @After
    13. public void after(){
    14. System.out.println("执行完毕===");
    15. }
    16. }

    三、List接口中sort方法排序

            1、List.sort方法排序

    1. /**@Description: List接口中sort方法排序
    2. * <br> 直接改变 原list集合顺序
    3. * @version v1.0
    4. * @author wu
    5. * @date 2022/6/22 16:40
    6. */
    7. @Test
    8. public void ListSortTest(){
    9. userList.sort((u1,u2)->u1.getAge()-u2.getAge());
    10. System.out.println("按照年龄排序ASC:"+userList);
    11. // 使用 Compator 方法
    12. userList.sort(Comparator.comparing(User::getId).reversed());
    13. System.out.println("使用 Compator 方法:"+userList);
    14. }

            2、多条件排序

    1. @Test
    2. public void ListSortTest2(){
    3. // 多条件排序: 年龄asc,id DESC
    4. // userList.sort(Comparator.comparing(User::getAge).thenComparing(User::getId).reversed());
    5. System.out.println("多条件排序: 年龄asc,id DESC:"+userList); // 不满足需求
    6. userList.sort(Comparator.comparing(User::getAge));
    7. userList.sort(Comparator.comparing(User::getId).reversed());
    8. System.out.println("多条件排序2: 年龄asc,id DESC:"+userList);
    9. }

    四、Stream中的sort方法排序

            1、使用Stream中的sort方法排序

    1. /**@Description: 使用Stream中的sort方法排序
    2. * <br> Stream 方法,不会改变原集合数据顺序,会生成新的List
    3. * @version v1.0
    4. * @author wu
    5. * @date 2022/6/22 16:56
    6. */
    7. @Test
    8. public void ListStramSortTest(){
    9. // stream 方法排序, 需要返回新的 List
    10. List<User> collect = userList.stream().sorted(Comparator.comparing(User::getId).reversed()).collect(Collectors.toList());
    11. System.out.println("Stream id DESC : "+ collect);
    12. List<User> collect1 = userList.stream().sorted((u1, u2) -> u2.getAge() - u1.getAge()).collect(Collectors.toList());
    13. System.out.println("Stream age DESC : "+ collect1);
    14. }

            2、并行的stream 排序

    1. @Test
    2. public void ListStramSortTest2(){
    3. // 并行的stream 排序
    4. List<User> collect = userList.parallelStream().sorted((u1, u2) -> {
    5. // 年龄 ASC , ID DESC 排序
    6. int age = u1.getAge() - u2.getAge();
    7. if(age == 0 ){
    8. // 年龄相等,则排序 id
    9. return u2.getId()- u1.getId();
    10. }
    11. return age ;
    12. }).collect(Collectors.toList());
    13. System.out.println("parallelStream - 年龄 ASC , ID DESC 排序: " + collect);
    14. }

    五、Collections类的sort方法排序

            1、java8前,匿名内部类方法

    1. /**@Description: Collections 类的sort方法
    2. * <br> 直接操作原List数据
    3. * @version v1.0
    4. * @author wu
    5. * @date 2022/6/22 17:11
    6. */
    7. @Test
    8. public void CollectionsSortTest(){
    9. // 原始方法
    10. Collections.sort(userList, new Comparator<User>() {
    11. @Override
    12. public int compare(User o1, User o2) {
    13. return o2.getAge()-o1.getAge();
    14. }
    15. });
    16. System.out.println("Collections.sort 原始方法:"+userList);
    17. }

            2、使用 lambda实现排序

    1. @Test
    2. public void CollectionsSortTest2(){
    3. Collections.sort(userList,(u1,u2)->u2.getId()-u1.getId());
    4. System.out.println("Collections.sort lambda :" +userList);
    5. Collections.sort(userList,Comparator.comparing(User::getAge));
    6. System.out.println("Collections.sort lambda comparing :" +userList);
    7. }

    六、总结

            1、Java8中,排序的方式有:List 接口中的 sort 方法 、 Stream 接口中的 sorted 方法、Collections.sort 工具类方法 。

            2、区别是:

    • List 接口中的 sort 方法 --- 操作原数据
    • Stream 接口中的 sorted 方法 --- 返回新List
    • Collections.sort 工具类方法 --- 操作原数据

  • 相关阅读:
    redisson序列化采坑那些事儿
    医院空调冷热源设计方案VR元宇宙模拟演练的独特之处
    APP渗透测试
    初步了解android如何锁键
    【Pygame实战】怀旧经典—这款给娃的棋类游戏,你还记得叫什么吧?(一定要收藏)
    “微软爱写作”连词摘录
    3d-DNA组装基因组
    CPI教程-异步接口创建及使用
    图神经网络 —— GNN通用计算管道
    pythonGUI(二)基本元素之一
  • 原文地址:https://blog.csdn.net/HaHa_Sir/article/details/125414125