首页 > 编程语言 >Java stream sorted自定义排序规则实现多字段排序

Java stream sorted自定义排序规则实现多字段排序

时间:2023-03-20 09:35:09浏览次数:50  
标签:UserDTO Java name 自定义 age 排序 true isBoy

  Stream 提供了丰富的操作(中间操作和终端操作)集合元素的轮子,但Stream流操作不影响原始集合数据,执行结果是一个新的集合对象。在《Java stream sorted使用 Comparator 进行多字段排序》中,小编Wiener介绍了使用Java Stream流排序器Comparator对List集合进行多字段排序的方法,包括复杂实体对象多字段升降序排序方法,本文介绍两个新的排序方法:

  1. 使用lambda表达式自定义排序规则;

  2. 使用匿名内部类重写Comparator方法以定义排序规则。

  测试数据中,类继续使用《Java stream sorted使用 Comparator 进行多字段排序》中的UserDTO,如下所示:

private static List<UserDTO> getUsers() {
    List<UserDTO> users = new ArrayList<>();
    users.add(new UserDTO(1L, "bWiener", 28, true));
    users.add(new UserDTO(2L, "张莉", 17, false));
    users.add(new UserDTO(3L, "李雪", 20, true));
    users.add(new UserDTO(6L, "王二", 27, true));
    users.add(new UserDTO(7L, "店小二", 27, false));
    users.add(new UserDTO(8L, "楼兰胡杨", 21, true));
    users.add(new UserDTO(9L, "aPrice", 28, true));
    return users;
}

使用lambda表达式实现排序

  lambda表达式又称为函数式编程,匿名函数可以将匿名函数代码块作为请求参数,语法更加简洁清爽,代码风格更加紧凑。使用lambda表达式修改sorted定义排序规则:

    /**
     * 使用lambda表达式定义排序规则
     */
    private static void defineOrderByLambda() {
        List<UserDTO> list = getUsers();
        list.stream().sorted((e1, e2) -> {
            if (e2.getAge().equals(e1.getAge())) {
                return e2.getName().compareTo(e1.getName());
            }
            return Integer.compare(e2.getAge(), e1.getAge());
        }).forEach(System.out::println);
    }

匿名内部类重写Comparator方法实现排序

  先创建Comparator接口的匿名内部类对象,然后在匿名内部类对象中重写compare方法,以实现排序。下述案例排序规则:先以年龄降序排列,再以姓名降序排列:

    /**
     * 使用匿名内部类重写Comparator方法以定义排序规则
     */
    private static void defineOrderByInnerClass() {
        List<UserDTO> list = getUsers();
        list.stream().sorted(new Comparator<UserDTO>() {
            @Override
            public int compare(UserDTO e1, UserDTO e2) {
                if (e2.getAge().equals(e1.getAge())) {
                    return e2.getName().compareTo(e1.getName());
                }
                return Integer.compare(e2.getAge(), e1.getAge());
            }
        }).forEach(System.out::println);
    }

  在Stream sorted() 中指定按照实体类的某个属性进行排序时,默认的排序规则是升序,如果需要降序,就需要调整对象的位置,使用对象2与对象1进行比较即可实现降序需求!

  基于如下测试用例进行验证,发现这两种排序方式都好用:

    public static void main(String[] args) {
        defineOrderByLambda();
        System.out.println("----------");
        defineOrderByInnerClass();
    }

  执行结果:

UserDTO(id=1, name=bWiener, age=28, isBoy=true)
UserDTO(id=9, name=aPrice, age=28, isBoy=true)
UserDTO(id=6, name=王二, age=27, isBoy=true)
UserDTO(id=7, name=店小二, age=27, isBoy=false)
UserDTO(id=8, name=楼兰胡杨, age=21, isBoy=true)
UserDTO(id=3, name=李雪, age=20, isBoy=true)
UserDTO(id=2, name=张莉, age=17, isBoy=false)
----------
UserDTO(id=1, name=bWiener, age=28, isBoy=true)
UserDTO(id=9, name=aPrice, age=28, isBoy=true)
UserDTO(id=6, name=王二, age=27, isBoy=true)
UserDTO(id=7, name=店小二, age=27, isBoy=false)
UserDTO(id=8, name=楼兰胡杨, age=21, isBoy=true)
UserDTO(id=3, name=李雪, age=20, isBoy=true)
UserDTO(id=2, name=张莉, age=17, isBoy=false)

结束语

  文章到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!

标签:UserDTO,Java,name,自定义,age,排序,true,isBoy
From: https://www.cnblogs.com/east7/p/17235210.html

相关文章

  • java反射机制原理及应用
    java反射机制反射机制原理示意图​ Class.forName(字节码文件)类.class对象.getClass()用法:根据配置的properties文件(不仅是properties)从而无需修改源代码的情......
  • 判断一个数字在数组中是否存在,并返回---Java
    packagepractice.people.apple;//在数组中查找一个数,看是否存在,请返回值publicclassFoundNumber{publicstaticvoidmain(String[]args){//定义数组intar......
  • Java问答
    目录什么样的标识符是合法的Java有几种基本数据类型短路与和短路或区别break和continue区别类的命名规则是什么java关键字区分大小写吗解释一下static关键字String是最基本......
  • Java项目是不是分布式,真有那么重要吗?
    大家好,我是3y啊。大概不知道从什么时候,「微服务」「分布式」这两个词又再次频繁出现在我的视线里。「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了......
  • 排序
    1.快速排序时间复杂度:平均复杂度为O(n·logn),最差情况下的复杂度为O(n2)空间复杂度:平均复杂度为O(logn),最差情况下的复杂度为O(n)1packageorg.example.sort;2......
  • java IO整理及读写文件常见方式
    一:流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在设备间传输称之为流。流的本质是数据传输,根据数据传输的特性将流区分为各......
  • fastadmin 自定义build_toolbar按钮
    fastadmin自定义build_toolbar按钮何渊渊于2020-09-2311:13:31发布1930收藏4分类专栏:fastadmin文章文章标签:javascriptphp版权fastadmin同时被2个专栏收......
  • JAVA异常处理
    Java异常简介:JAVA异常处理的目的是为保证程序在出错之后,依旧可以执行一些其它操做。该操作可以是用户的其它行为,也可以是保存程序运行后的一些结果,还可以是合理的结束程......
  • JAVA -01(简单知识介绍)
    JAVA-01前期准备介绍1972年C诞生【两大问题:指针;内存管理】1982年C++诞生【面向对象;兼容C;图形领域和游戏,但是更复杂】1995年JAVA诞生【没有指针没有内存管理;面向对象......
  • 打牢JavaScript 基础,看这篇
    原文链接:​   ​​https://note.noxussj.top/?source=51cto​​变量声明​在JavaScript程序中,使用一个变量之前应当先声明。变量是使用关键字 ​​var​​ 来声明的......