栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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类,相关属性如下:

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 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方法排序

@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方法排序

@Test
public void ListStramSortTest(){
    // stream 方法排序, 需要返回新的 List
    List collect = userList.stream().sorted(Comparator.comparing(User::getId).reversed()).collect(Collectors.toList());
    System.out.println("Stream id DESC : "+ collect);

    List 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 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前,匿名内部类方法

@Test
public void CollectionsSortTest(){
    // 原始方法
    Collections.sort(userList, new Comparator() {
        @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 工具类方法 --- 操作原数据

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984600.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号