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

2年前 (2022) 程序员胖胖胖虎阿
280 0 0

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

一、概述

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

        分别是:

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

二、准备工作

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

public static class User{
    int id ;
    String name ;
    int age ;
    String addr ;

    public User(int id, String name, int age, String addr) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.addr = addr;
    }
    // ignore getter/setter/toString
}

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

public class ListSortTest {

    List<User> userList =  null;

    @Before
    public void init(){
        userList =  Lists.newArrayList();
        userList.add(new User(1,"小明",22,"北京"));
        userList.add(new User(2,"小红",18,"上海"));
        userList.add(new User(3,"小花",22,"广州"));
        userList.add(new User(4,"小刚",33,"深圳"));

        System.out.println("原始数据是:"+userList);
    }

    @After
    public void after(){
        System.out.println("执行完毕===");
    }

}

三、List接口中sort方法排序

        1、List.sort方法排序

/**@Description: List接口中sort方法排序
 * <br> 直接改变 原list集合顺序
 * @version v1.0
 * @author wu
 * @date 2022/6/22 16:40
 */
@Test
public void ListSortTest(){
    userList.sort((u1,u2)->u1.getAge()-u2.getAge());
    System.out.println("按照年龄排序ASC:"+userList);

    // 使用 Compator 方法
    userList.sort(Comparator.comparing(User::getId).reversed());
    System.out.println("使用 Compator 方法:"+userList);
}

        2、多条件排序

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

        userList.sort(Comparator.comparing(User::getAge));
        userList.sort(Comparator.comparing(User::getId).reversed());
        System.out.println("多条件排序2: 年龄asc,id DESC:"+userList);
    }

四、Stream中的sort方法排序

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

/**@Description: 使用Stream中的sort方法排序
 * <br> Stream 方法,不会改变原集合数据顺序,会生成新的List
 * @version v1.0
 * @author wu
 * @date 2022/6/22 16:56
 */
@Test
public void ListStramSortTest(){
    // stream 方法排序, 需要返回新的 List
    List<User> collect = userList.stream().sorted(Comparator.comparing(User::getId).reversed()).collect(Collectors.toList());
    System.out.println("Stream id DESC : "+ collect);

    List<User> collect1 = userList.stream().sorted((u1, u2) -> u2.getAge() - u1.getAge()).collect(Collectors.toList());
    System.out.println("Stream age DESC : "+ collect1);
}

        2、并行的stream 排序

@Test
public void ListStramSortTest2(){
    // 并行的stream 排序
    List<User> collect = userList.parallelStream().sorted((u1, u2) -> {
        // 年龄 ASC , ID DESC 排序
        int age = u1.getAge() - u2.getAge();
        if(age == 0 ){
            // 年龄相等,则排序 id
            return u2.getId()- u1.getId();
        }
        return age ;
    }).collect(Collectors.toList());

    System.out.println("parallelStream - 年龄 ASC , ID DESC 排序: " + collect);
}

五、Collections类的sort方法排序

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

/**@Description: Collections 类的sort方法
 * <br> 直接操作原List数据
 * @version v1.0
 * @author wu
 * @date 2022/6/22 17:11
 */
@Test
public void CollectionsSortTest(){
    // 原始方法
    Collections.sort(userList, new Comparator<User>() {
        @Override
        public int compare(User o1, User o2) {
            return o2.getAge()-o1.getAge();
        }
    });

    System.out.println("Collections.sort 原始方法:"+userList);
}

        2、使用 lambda实现排序


@Test
public void CollectionsSortTest2(){
    Collections.sort(userList,(u1,u2)->u2.getId()-u1.getId());
    System.out.println("Collections.sort lambda :" +userList);

    Collections.sort(userList,Comparator.comparing(User::getAge));
    System.out.println("Collections.sort lambda comparing :" +userList);
}

六、总结

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

        2、区别是:

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

相关文章

暂无评论

暂无评论...