Java中 List 集合,通过 Stream 流进行排序总结
一、数据准备
public class OrderTest {private String channelCode;private BigDecimal rate;// 省略 getter、setter、toString()、constructor
}
List<OrderTest> orderTestList = new ArrayList<>();OrderTest z09 = new OrderTest("Z09", new BigDecimal("7.6677"));OrderTest B2C = new OrderTest("B2C", new BigDecimal("5.6666"));OrderTest Z04 = new OrderTest("Z04", new BigDecimal("4.3137"));OrderTest ALL = new OrderTest("ALL", new BigDecimal("4.3137"));OrderTest ALL1 = new OrderTest("ALL", new BigDecimal("4.5137"));// 演示多字段排序使用OrderTest z091 = new OrderTest("Z09", new BigDecimal("7.6671"));// 演示给 null 值排序用OrderTest z092 = new OrderTest("Z09", null);OrderTest B2C1 = new OrderTest("B2C", new BigDecimal("5.6666"));OrderTest Z041 = new OrderTest("Z04", null);orderTestList.add(z09);orderTestList.add(z091);orderTestList.add(B2C);orderTestList.add(Z04);orderTestList.add(ALL);orderTestList.add(ALL1);
二、单字段排序
2.1、升序
list.stram().sorted(Comparator.Comparing(YourClass::Class's Field)
System.out.println("----------------------------------------------");System.out.println("只按照 channelCode 升序排序:");List<OrderTest> channelAsc =orderTestList.stream().sorted(Comparator.comparing(OrderTest::getChannelCode)).collect(Collectors.toList());channelAsc.forEach(System.out::println);
结果:
2.2、降序
list.stram().sorted(Comparator.Comparing(YourClass::Class's Field, Comparator.reverseOrder())
System.out.println("----------------------------------------------");System.out.println("只按照 channelCode 降序排序:");List<OrderTest> channelDesc =orderTestList.stream().sorted(Comparator.comparing(OrderTest::getChannelCode, Comparator.reverseOrder())).collect(Collectors.toList());channelDesc.forEach(System.out::println);
结果:
二、多字段排序
利用的是 thenComparing():
升序 thenComparing(YourClass::Class's Field),
降序 thenComparing(YourClass::Class's Field, Comparator.reverseOrder())。注意: 使用 thenComparing(YourClass::Class's Field).reversed() 的时候要注意排序要求,
如果先按照 A 字段升序 B 字段升序的话,使用 reversed() 之后的结果是对 A 降序 B 降序。
System.out.println("----------------------------------------------");System.out.println("先按照 channelCode 升序,再按照 rate 升序排序:");List<OrderTest> channelCodeAscRateAscList =orderTestList.stream().sorted(Comparator.comparing(OrderTest::getChannelCode).thenComparing(OrderTest::getRate)).collect(Collectors.toList());channelCodeAscRateAscList.forEach(System.out::println);
结果
先按照 channelCode 将序,再按照 rate 升序将序,使用 reversed():
System.out.println("----------------------------------------------");System.out.println("先按照 channelCode 将序,再按照 rate 将序排序,使用 reversed():");List<OrderTest> channelCodeAscRateAscWithReversedList =orderTestList.stream().sorted(Comparator.comparing(OrderTest::getChannelCode).thenComparing(OrderTest::getRate).reversed()).collect(Collectors.toList());channelCodeAscRateAscWithReversedList.forEach(System.out::println);
结果
三、对 null 值处理
Comparator.nullsFirst(Comparator.reverseOrder()) -- null排在前面,reverseOrder是倒序,升序用naturalOrderComparator.nullsLast(Comparator.reverseOrder()) -- null排在后面,reverseOrder是倒序,升序用naturalOrder
orderTestList.add(new OrderTest(("Z09")));orderTestList.add(new OrderTest(("B2C")));orderTestList.add(new OrderTest(("Z04")));System.out.println("----------------------------------------------");System.out.println("先按照 channelCode 升序,再按照 rate 降序并且 null 值放前面排序:");List<OrderTest> channelCodeAscRateDescNullFirstList = orderTestList.stream().sorted(Comparator.comparing(OrderTest::getChannelCode).thenComparing(OrderTest::getRate, Comparator.nullsFirst(Comparator.reverseOrder()))).collect(Collectors.toList());channelCodeAscRateDescNullFirstList.forEach(System.out::println);
结果
四、对排序字段个数不固定的情况,如何排序
需求:排序字段个数不确定,如何实现动态排序?
伪代码示例:
Comparator<SurgUnArrangeResponse> comparing = null;for (int i = 0; i < dictItemList.size(); i++) {String cd = dictItemList.get(i).getCd();if (i == 0) {// 首次排序comparing = getComparingByDictCd(cd, null);} else {// 第二次排序及以上comparing = getComparingByDictCd(cd, comparing);}}// comparing 比较器,保存了排序的规则,responseList 是被排序的集合responseList = responseList.stream().sorted(comparing).collect(Collectors.toList());// getComparingByDictCd 方法private Comparator<SurgUnArrangeResponse> getComparingByDictCd(String dictCd,
Comparator<SurgUnArrangeResponse> result = null;switch (dictCd) {case "age":result = comparing == null ? Comparator.comparing(SurgUnArrangeResponse::getAge, Comparator.nullsLast(Comparator.reverseOrder())) :comparing.thenComparing(SurgUnArrangeResponse::getAge, Comparator.nullsLast(Comparator.reverseOrder()));break;....}return result;}
相关文章:
Java中 List 集合,通过 Stream 流进行排序总结
一、数据准备 public class OrderTest {private String channelCode;private BigDecimal rate;// 省略 getter、setter、toString()、constructor }List<OrderTest> orderTestList new ArrayList<>();OrderTest z09 new OrderTest("Z09", new BigDeci…...
1688中国站按关键字搜索工厂数据 API
公共参数 名称类型必须描述keyString是申请免费调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...
YOLOV8逐步分解(2)_DetectionTrainer类初始化过程
接上篇文章yolov8逐步分解(1)--默认参数&超参配置文件加载继续讲解。 1. 默认配置文件加载完成后,创建对象trainer时,需要从默认配置中获取类DetectionTrainer初始化所需的参数args,如下所示 def train(cfgDEFAULT_CFG, use_pythonFalse…...
Java是用什么语言写的?PHP呢?
Java底层是C语言。 Sun公司研发人员根据嵌入式软件的要求,对C进行了改造,去除了留在C的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。而后,经过迭代更新,…...
SpringBoot Redis的使用
官方文档: 官方文档:Spring Data Redis :: Spring Data Redis 和jedis一样,SpringBoot Redis 也可以让我在Java代码中使用redis,同样也是通过引入maven依赖的形式。 加速访问github: 使用steam可以免费加速访问github Spring…...
数据仓库——维度表特性
企业信息化工厂 数据集市中的一致性,由于企业信息化工厂的数据集市是从集成仓库中获得信息的,因此至少从维度建模的角度来看,一致性维护的问题减少了。尽管合并不同数据源的问题依然在,但是负担主要在设计者身上。尽管压力降低了…...
从电荷角度理解开关电容中的电荷守恒
目录 一些铺垫电容的电荷量的解释电荷流入流出对节点电压的影响 从电荷角度理解开关电容加法器中的电荷守恒以开关电容积分器为例说明什么样的节点是电荷守恒 一些铺垫 电容的电荷量的解释 对于一个1F的电容,当它的压差为1V时,它所携带的电荷量是QCU1库…...
1.7.1 python 作业 15道
1、求出1 / 1 1 / 3 1 / 5……1 / 99的和 (1分之一1分之三1分支5....) sum0 for i in range(1,100,2): sum 1/i sum; print(sum) 2、用循环语句,计算2 - 10之间整数的循环相乘的值 (2*3*4*5....10) sum 1 for i in range(2,11): sum sum *…...
synchronized 和 ReentrantLock 的区别是什么
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:synchronized 和 ReentrantLock 的区别是什么 1. 获取锁的方式 synchronized:synchronized的锁获取是隐式的。当线程进入synchronized修饰的代码…...
大话设计模式之迪米特法则
迪米特法则,也称为最少知识原则(Law of Demeter),是面向对象设计中的一个重要原则,其核心思想是降低耦合度、减少对象之间的依赖关系,从而使系统更加灵活、易于维护和扩展。 根据迪米特法则,一…...
KSD测试系统使用方法和注意事项
①下载链接在最顶部; ②安装方法:应该先将测试设备绑定在假人身上,测试设备不能过度往下拉,传感器绑在脖子上,切记最后才开传感器开关!!!开传感器后3秒内不要碰测试设备衣服&#x…...
IT服务营销管理案例分析题
习题一 企业随着业务的蓬勃发展,所投入的基础设施资源不断增加。企业员工数倍数增长,办公场地、办公环境等要求也越来越高。 可是该企业的IT部门人员短缺,对IT管理还处于被动的“救火”阶段,每天至少15个突发故障,故障…...
NRF52832修改OTA升级时的bootloader蓝牙MAC
NRF52832在OTA升级时,修改了APP的蓝牙MAC会导致无法升级,原因是OTA程序的蓝牙MAC没有被修改所以手机扫描蓝牙时无法连接 解决办法 在bootloader的程序里面加入修改蓝牙mac地址的代码实现原理: 在bootloader蓝牙广播开启之前修改蓝牙mac 通…...
# Python 编程入门教程
欢迎来到 Python 编程入门教程!Python 是一种简单易学、功能强大的编程语言,适用于各种应用场景,从简单的脚本到大型软件开发项目。无论你是初学者还是有一定编程经验的开发者,本教程都将为你提供全面的学习路径,帮助你掌握 Python 编程的基础知识和技能。 ## 目录 1. 简…...
Sqoop【实践 02】Sqoop1最新版 全库导入 + 数据过滤 + 字段类型支持 说明及举例代码(query参数及字段类型强制转换)
Sqoop1最新版举例 1.环境说明2.import-all-tables3.query4.字段类型支持 1.环境说明 还是之前的环境: # 不必要信息不再贴出 # JDK [roottcloud ~]# java -version java version "1.8.0_251" # MySQL [roottcloud ~]# mysql -V mysql Ver 14.14 Distrib…...
第十四届蓝桥杯JavaA组省赛真题 - 特殊日期
解题思路: 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…...
《VulnHub》Lampião:1
title: 《VulnHub》Lampio:1 date: 2024-03-28 21:37:49 updated: 2024-03-28 21:37:50 categories: WriteUp:Cyber-Range excerpt: 关键技术:主机发现,端口扫描、服务探测、操作系统探测,对开放的端口探测漏洞&#x…...
RabbitMq高可用
消息队列高级 服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.2.消息持久化1.3.消费者消息确认1.4.消费失败重试机制1.5.总结 2.死信交换机2.1.初识死信交换机2.2.TTL2.3.延迟队列 3.惰性队列3.1.消息堆积问题3.2.惰性队列 4.MQ集群4.1.集群分类4.2.普通集群4.3.镜像集群…...
降本增效的车间管理大屏,车间主任看了拍手称快,速来领取。
我们老板觉得车间生产效率太低了,还想让我整一套车间管理的! 制造业管理的核心在于降本增效,车间管理可以通过【大数据可视化】来提高管理效率,大屏就可以做到生产管理一「屏」了然,这是【车间管理大屏方案】。 一、…...
Open AI要给GPT应用开发者“发钱” 黄金的宏观关系被打破了吗?
内容摘要 为避免GPTs彻底凉凉,Open AI紧急启动了一项“货币化”计划,直接给那些在GPT Store上的应用开发人员发钱。 正文部分 当地时间周四凌晨,OpenAI在社交媒体上发帖称,正在与小部分美国开发者合作,基于用户使用…...
【Docker】Docker安全与最佳实践:保护你的容器化应用程序
欢迎来到英杰社区: https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区: https://bbs.csdn.net/topics/617897397 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步ÿ…...
QT 信号(Signal)与槽(Slot)机制
上学后,人们问我长大了要做什么,我写下“快乐”。他们告诉我,我理解错了题目,我告诉他们,他们理解错了人生。 ——约翰列侬 一、信号(signal)与槽(slot) 在QT中,信号(signal)与槽(slot)机制是一种用于对象间通信的重要机制。它允许一个对象发出信号,而其他对象…...
音频干扰检测(频域方法)
测试音响系统的通路上是否有外部干扰时,可以通过播放1000赫兹的正弦波信号,在输出端采集数字信号(I2S,TDD,A2B)并保存为.wav文件。 然后通过以下Python代码检测。 import numpy as np import librosa im…...
Rust引用借用 vs 原始指针
let v: i32 10; let v1 &v; let a: *const i32 &v; println!("a{:p}", a); let b a as *mut i32; //无法从&v直接转换成*mut i32,需要从*const i32过度 println!("b{:p}", b); unsafe {*b1; } println!("v{} v1{}"…...
抖音视频关键词无水印下载软件|手机网页视频批量提取工具
全新视频关键词无水印下载软件,助您快速获取所需视频! 随着时代的发展,视频内容已成为人们获取信息和娱乐的重要途径。为了方便用户获取所需视频,推出了一款功能强大的视频关键词无水印下载软件。该软件主要功能包括关键词批量提取…...
关于Devc++调试的问题以及解决STL变量无法查看
目前Devc的调试主要有以下几点: 1.调试不能直接查看stl变量,会卡死不动 2.目前单步进入只能用鼠标键按 3.若想按下一步进入函数体内,要在函数体内打上断点才行 4.调试到return 0 ;上一句就停了,不会结束程序 5.目前F2跳至断点…...
MATLAB:优化与规划问题
一、线性规划 % 线性规划(Linear programming, 简称LP) fcoff -[75 120 90 105]; % 目标函数系数向量 A [9 4 7 54 5 6 105 10 8 53 8 9 77 6 4 8]; % 约束不等式系数矩阵 b [3600 2900 3000 2800 2200]; % 约束不等式右端向量 Aeq []; % 约束等式系…...
Oracal执行计划解析
概述 | Id | Operation | Name | Rows | Bytes | TempSpc | Cost (%CPU) | Time | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1…...
对form表单对象中数组中的字段进行校验的方法
当对form表单中,数组readings中的字段进行校验时,prop和rules绑定要写成动态的,如下代码 <div v-for"(item,index) in form.readings"><el-form-item label"上次读数" > <!--prop"scds"-->…...
一、JAVA集成海康SDK
JAVA集成海康SDK 文章目录 JAVA集成海康SDK前言一、项目依赖 jar1. examples.jar2. 项目依赖 jna.jar,可以通过 maven依赖到。二、集成SDK1.HcNetSdkUtil 海康 SDK封装类2.HCNetSDK3.Linux系统集成SDK三、总结前言 提示:首先去海康官网下载 https://open.hikvision.com/dow…...
郑州网站建设招聘/泰州seo外包公司
持久化的简介RDBAOFRDB与AOF的区别持久化应用场景对于持久化这个功能点,其实很简单没有那么复杂演示环境centos7.0redis4.0redis存放目录:/usr/local/redisredis.conf存放目录:/usr/local/redis/data1. 持久化简介redis的所有数据都是保存在内…...
上海做网站的多吗/谷歌 chrome 浏览器
smali文件格式 每个smali文件都由若干条语句组成,所有的语句都遵循着一套语法规则。在smali 文件的头3 行描述了当前类的一些信息,格式如下: [java] view plaincopy.class < 访问权限> [ 修饰关键字] < 类名> .super < 父类名…...
建设银行网站注销吗/网站优化外包
模板链接: 支持区间加减,乘。询问区间和。 要注意的几点: 1.输出格式!!!! 2.$printf("")$语法要写对,不然的话能过编辑,半天调不出来。 3.位运算的时候$>&g…...
如何编辑做网站/西安优化seo托管
我必须创建字体为Times New Roman、字体大小为16的内容。如何使用python脚本创建? 我的示例脚本import xlwt workbook xlwt.Workbook(encoding ascii) worksheet workbook.add_sheet(My Worksheet) font xlwt.Font() # Create the Font font.name Times New Ro…...
廊坊模板网站建设/百度竞价推广出价技巧
本系统为牛旦教育IT课堂在微头条上发布的内容,为便于查阅,特辑录于此,都是常用SQL基本用法。前两篇连接:(一):SQL点滴(查询篇):数据库基础查询案例实战(二):SQL点滴(排序篇):数据常规…...
巴中城市建设投资有限公司网站/房地产销售技巧和话术
发现问题我使用的Oracle11g,当我敲下如下一段命令后,就让我傻眼了。。alter system set sga_max_size960M scopespfile;shutdown immediatestartup此时的startup报错了,错误为:SQL> startupORA-00844: Parameter not taking ME…...