Java stream sorted自定义排序规则实现多字段排序
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)
结束语
文章到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!
Java stream sorted自定义排序规则实现多字段排序的更多相关文章
- JAVA实现按列表中元素的时间字段排序
JAVA代码实现按列表中元素的时间字段排序 导语: 工作中遇到一个问题,调用第三方接口返回的数据没有按时间倒序排列,测试说要加,然后在网上找到一个解决办法,这里记录一下 需求: 如下图列表,按生日进行 ...
- 在Java中使用Collections.sort 依据多个字段排序
一.如何使用Collections工具类进行排序 使用Collections工具类进行排序主要有两种方式: 1.对象实现Comparable接口,重写compareTo方法 /** * @author ...
- mysql 字段指定值靠前排序方法,多字段排序排序方法
背景:SEO下选择某查询条件 查询展示信息为装修设计师以及设计师作品.设计师原型设计为:选择某风格 例如:简约,则列表出现拥有简约风格的设计师信息以及该设计师类型为简约的作品(3条靠前记录) 浏览原型 ...
- SQL 先固定特殊的几行数据之外再按照某一字段排序方法(CASE 字段排序(CASE WHEN THEN)
查询用户表的数据,管理员用户始终在最前面,然后再按照CreateTime排序: SELECT TOP * FROM [dbo].[User] WHERE ParentID = '**' ORDER B ...
- java利用自定义类型对树形数据类型进行排序
前言 为什么集合在存自定义类型时需要重写equals和hashCode? 1.先说List集合 List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了! 因为我 ...
- HTML连载45-浮动元素脱标、排序规则、贴靠现象
一.浮动元素脱标 1.什么是浮动元素脱标 脱标:脱离标准流. 当某一个元素浮动之后,那么这个元素看上去就像被从标准流中删除了一样 2.浮动元素脱标之后有什么影响 如果前面一个元素浮动了,而后面的一个元 ...
- MS SQL 排序规则总结
排序规则术语 什么是排序规则呢? 排序规则是根据特定语言和区域设置标准指定对字符串数据进行排序和比较的规则.SQL Server 支持在单个数据库中存储具有不同排序规则的对象.MSDN解 ...
- SQL SERVER修改排序规则——脚本篇
在上篇MS SQL 排序规则总结中,大致就数据库服务器排序规则(或者叫数据库实例排序规则).数据库排序规则.列的排序规则粗浅的叙说了一遍,重点讲述了修改数据库服务器排序规则(数据库实例排序规则),其中 ...
- [转]LocalDB数据库修改排序规则,修复汉字变问号
VS中新增的轻量级数据库LocalDB,有个这个,开发人员就不必再安装庞大的SQL server了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...
- sql server 排序规则
/* 排序规则根据特定语言和区域设置的标准指定对 字符串 数据 进行排序和比较的规则. 以 ORDER BY 子句为例:如果按升序排列,说英语的人认为字符串 Chiapas 应排在 Col ...
随机推荐
- Top-N推荐算法 Top-N recommendation Algorithms
引言 推荐算法是计算机专业中的一种算法,通过一些计算,能够推测用户喜欢的东西,在互联网环境中应用比较广泛.Top-N算法在生活中非常常见,比如学术论文推荐论文.音乐软件推荐歌曲等. 今天看到一篇名叫& ...
- helm部署redis集群
Redis 集群部署流程 前提:K8s+helm安装完成 1. 安装 NFS 服务器 1.1 安装 NFS 工具包 在 NFS 服务器上安装 nfs-utils 包: sudo yum install ...
- 在Linux系统下验证万兆网络(10Gbps)的性能和配置情况,可以通过多种方法来实现
在Linux系统下验证万兆网络(10Gbps)的性能和配置情况,可以通过多种方法来实现.以下是一些常用的步骤和工具: 1. 确认硬件支持 首先,确保您的计算机硬件支持万兆网络.这包括: 网卡:确认您的 ...
- CATIA许可证破解方法(CMD版)
<<< catia的DS License Server Administration后不会自动弹出GUI界面,就需要使用CMD来破解安装许可证. <<< 1. ca ...
- Ubuntu修改启动顺序以及系统时间同步问题
Ubuntu修改启动顺序以及系统时间同步问题 修改启动顺序 选择要优先启动的序号,从0开始计数 修改配置文件 sudo vim /etc/default/grub 使用这个命令刷新一下 sudo up ...
- SearXNG私有化部署与Dify集成
一.概述 SearXNG 是一个免费的互联网元搜索引擎,它聚合了来自各种搜索服务和数据库的结果,但摆脱了隐私追踪 -- 用户行为既不会被引擎跟踪也不会被分析. 功能特性 自托管,可以私有化部署 没有用 ...
- SRAM的读、写操作、信息保持原理
\(Vcc\)会使得\(T_3\)和\(T_4\)导通,但是哪个先导通是随机的,那么当\(T3\)先导通的时候,\(a\)点变为高电平,此时电流经由 \(a\) 点导通\(T2\),\(T2\)导通, ...
- c数组与结构体
数组,存储同类型的复合类型:结构体,存储不同类型的复合类型,用于自定义数据结构. 计算机中,针对存储大量数据的集合,有着两种方式,一种是以块式集中存储数据,这就是数组的存储方式,大量同类型的数据集中放 ...
- Codeforces Round 1016 (Div. 3)题解
题目地址 https://codeforces.com/contest/2093 锐评 在所有题意都理解正确的情况下,整体难度不算太难.但是偏偏存在F这么恶心的题意,样例都不带解释一下的,根本看不懂题 ...
- day11”函数“入门
函数 函数的作⽤ 函数的使⽤步骤 函数的参数作⽤ 函数的返回值作⽤ 函数的说明⽂档 函数嵌套 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利 ...