Stream——集合数据按照某一字段排序
文章目录
- 前言
- 假设业务场景
- 排序前的准备
- 正序排序
- 1、数据集合的判空 Optional.isPresent()
- 2、使用sort排序
- 3、将排序后的数据流转换为list
- 你以为这样就完了?
- 倒序排序
前言
之前,针对Stream链式编程中的几个方法做了大致的说明。详情可以参考:
JDK 1.8 新特性之Stream 详解个人笔记
但实际业务中,总会存在很多复杂的思维,需要使用到Stream,此时玩的不熟练总感觉无从下手。
今后开始写几种常用的逻辑方式。
假设业务场景
在数据查询出来后,需要针对集合中的数据信息,按照某一字段进行正序或倒序排序。
排序前的准备
创建一个数据元类,并填充数据做一个指定对象的数据集合。
class Users{private String userName;private String password;public Users(String userName, String password) {this.userName = userName;this.password = password;}public String getUserName() {return userName;}@Overridepublic String toString() {return "Users{" +"userName='" + userName + '\'' +", password='" + password + '\'' +'}';}
}
测试数据集合如下:
List<Users> users = Arrays.asList(new Users("xj5", "555"), new Users("xj2", "2222"), new Users("xj1", "1111"), new Users("xj3", "3333"));
正序排序
Stream中的排序,通常会使用到其中的sort()方法,接下来就按步骤进行数据排序操作。
1、数据集合的判空 Optional.isPresent()
从数据库等其他方式获取到的数据,并非就一定存在。虽然在本次定义了测试数据集合,但为了代码逻辑的健壮性,则需要经过如下操作处理。
System.out.println("-----> " + Optional.ofNullable(null).isPresent());
System.out.println("-----> " + Optional.ofNullable(new ArrayList<>()).isPresent());
执行后的结果:
-----> false
-----> true
所以,上面的数据集合可以进行下列操作。
Optional.ofNullable(users).orElse(new ArrayList<Users>())
当然也可以通过Optional.ofNullable(集合别名).isPresent()判断集合是否存在,再通过返回 boolean 判断是否继续向下执行链式编程代码。
2、使用sort排序
使用sort排序时,如果其中是对象,则还需要使用一个Comparator.comparing()的方法转换。
Optional.ofNullable(users).orElse(new ArrayList<Users>()).stream().sorted(Comparator.comparing(Users::getUserName))
3、将排序后的数据流转换为list
List<Users> collect = Optional.ofNullable(users).orElse(new ArrayList<Users>()).stream().sorted(Comparator.comparing(Users::getUserName)).collect(Collectors.toList());
执行后,日志输出如下信息:
[Users{userName='xj1', password='1111'},Users{userName='xj2', password='2222'}, Users{userName='xj3', password='3333'}, Users{userName='xj5', password='555'}]
你以为这样就完了?
Optional.ofNullable只是判断传递的参数是否为null,如果传递的参数是对象,则还需要注意对象中的每个属性的数据是否为null。
看一个反例,如果其中某个对象的值是null时,会出现什么样的情况?
package xj.test.streams;import java.util.*;
import java.util.stream.Collectors;public class Test6 {public static void main(String[] args) {List<Users> users = Arrays.asList(new Users("xj5", "555"), new Users("xj2", "2222"), new Users("xj1", "1111"), new Users("xj3", "3333"), new Users(null,"null"));List<Users> collect = Optional.ofNullable(users).orElse(new ArrayList<Users>()).stream().sorted(Comparator.comparing(Users::getUserName)).collect(Collectors.toList());System.out.println(collect);}
}

此处出现空指针的问题,在于Comparator.comparing中的数据元,存在空的问题,报错!
解决方式也很简单,将需要排序的字段,在sort操作之前可以进行一次过滤,如下:
public class Test6 {public static void main(String[] args) {List<Users> users = Arrays.asList(new Users("xj5", "555"), new Users("xj2", "2222"), new Users("xj1", "1111"), new Users("xj3", "3333"), new Users(null,"null"));List<Users> collect = Optional.ofNullable(users).orElse(new ArrayList<Users>()).stream().filter(x->Objects.nonNull(x) && x.getUserName() != null).sorted(Comparator.comparing(Users::getUserName)).collect(Collectors.toList());System.out.println(collect);}
}
成功解决!
倒序排序
倒序排序操作并不是很复杂,只需要在排序的Comparator.comparing(Users::getUserName)后,将结果使用reversed()反转一下就可以实现。如下所示:
public class Test6 {public static void main(String[] args) {List<Users> users = Arrays.asList(new Users("xj5", "555"), new Users("xj2", "2222"), new Users("xj1", "1111"), new Users("xj3", "3333"), new Users(null,"null"));List<Users> collect = Optional.ofNullable(users).orElse(new ArrayList<Users>()).stream().filter(x->Objects.nonNull(x) && x.getUserName() != null).sorted(Comparator.comparing(Users::getUserName).reversed()).collect(Collectors.toList());System.out.println(collect);}
}

相关文章:
Stream——集合数据按照某一字段排序
文章目录前言假设业务场景排序前的准备正序排序1、数据集合的判空 Optional.isPresent()2、使用sort排序3、将排序后的数据流转换为list你以为这样就完了?倒序排序前言 之前,针对Stream链式编程中的几个方法做了大致的说明。详情可以参考: J…...
ubuntu:20.04编译arrow
1)拉取代码 git clone https://github.com/apache/arrow.git 2)切换分支 git checkout apache-arrow-11.0.0 3)拉入测试数据并设置环境变量 pushd arrow git submodule update --init export PARQUET_TEST_DATA"${PWD}/cpp/submodules/parquet-testing/da…...
2023如果纯做业务测试的话,在测试行业有出路吗?
直接抛出我的结论:手工做业务类测试,没有前途。 个人建议赶紧从业务测试跳出来,立即学习代码,走自动化测试方向。目前趋势,业务测试需要用自动化做。 为了让大家能够信服我的观点,本文将从以下方面进行阐…...
golang grpc ssl
无CA场景 在不考虑CA的场景下呢,client有client.key和client.crt,server有server.key和server.crt,生成方式可以如下: $ openssl genrsa -out server.key 2048 $ openssl req -new -x509 -days 3650 \-subj "/CGB/LChina/Og…...
华为服务器驱动下载及安装
1.服务器技术支持网站 https://support.xfusion.com/support/#/zh/home 2.选择软件下载 3.选择服务器型号 4.选择驱动 5.根据需求选择驱动 例如红帽7.4系统 6.安装驱动 自动安装驱动步骤: 1)使用BMC虚拟光驱挂载onboard_driver_xxx.iso: 2)mount /dev/sr0 /mnt …...
【Shell】常用命令合集
常用命令: 文件和目录: cd /home 进入 ‘/home’ 目录 cd … 返回上一级目录 cd …/… 返回上两级目录 cd - 返回上次所在目录 cp file1 file2 将file1复制为file2 cp -a dir1 dir2 复制一个目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录(.代表当前目录…...
15- 答题卡识别及分数判定项目 (OpenCV系列) (项目十五)
项目要点 图片读取 : img cv2.imread(./images/test_01.png)灰度图: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)高斯模糊: blurred cv2.GaussianBlur(gray, (5, 5), 0) # 去噪点边缘检测: edged cv2.Canny(blurred, 75, 200)检测轮廓: cnts cv2.findContours(e…...
LeetCode 热题 C++ 146. LRU 缓存
力扣146 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否…...
Java线程池使用与原理解析(线程池优点、使用方法、参数含义及线程池运转机制)
为什么要使用线程池? JDK1.5后JUC包添加了线程池相关接口,在Java诞生之初并没有线程池这个概念。刚开始Java程序都是自行创建线程去处理任务。随着应用使用的线程越来越多,JDK开发者们发现有必要使用一个统一的类来管理这些线程,…...
mybatis入门配置
mybatis mybatis是一款持久层框架,用于简化JDBC开发 持久层:负责将数据保存到数据库的那一层代码JavaEE的三层架构:表现层、业务层、持久层、,就相当与mvc设计模式过程中的Controller、service、dao 1.创建一个maven模块&#…...
黑客入门(超级详细版)
据我了解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情,因为邪派黑客所…...
Java多线程(三)---synchronized、Lock和volatile
Java内存模型(非JVM)Java内存模型(Java Memory Model简称JMM),是一种共享内存模型,是多线程的东西,并不是JVM(Java Virtual Machine(Java虚拟机)的缩写),这是俩玩意儿!&a…...
JVM-Java内存区域
运行时数据区:1、程序计数器:当前线程所执行的字节码指令的行号指示器。在Java虚拟机的概念模型里,字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环…...
毕业季,毕业论文查重,paper系列五个免费查重网站推荐
推荐五个常用的免费查重网站 注意: (1)这些网站基本上都可以通过关注公众号或者转发等来获取免费查重机会,但有些也会有字数限制。每个网站的数据库可能不同,所以建议大家多换几个平台查一查,反正是免费的…...
破解票房之谜:为何高票房电影绕不过“猫眼们”?
如此火爆的春节档很多,如此毁誉参半的春节档鲜有。2023开年,集齐张艺谋、沈腾的《满江红》,以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十,为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…...
订单服务-----遇到的问题及解决方案
订单服务的问题及解决方案问题1:Feign远程调用时丢失请求头编辑出现这个Feign远程调用时丢失请求头的问题是因为Feign在远程调用的时候会创建一个新的请求,但是这个新的请求里啥都没有,没有cookie值,而这个cookie值里有成功登录后…...
项目经理如何度量项目?及项目度量指标实例【静说】
度量项目是项目经理的一个重要职责,通过度量项目,项目经理可以了解项目的进展情况,及时发现问题并采取相应的措施,以确保项目能够按时、按质、按预算完成。 分享给大家一些常见的项目度量指标: 1. 项目进度ÿ…...
我们应该如何优雅的处理 React 中受控与非受控
引言 大家好,我是19组清风。有段时间没有和大家见面了,最近因为有一些比较重要的事情(陪女朋友和换了新公司)在忙碌所以销声匿迹了一小段时间, 后续会陆陆续续补充之前构建 & 编译系列中缺失的部分,提…...
力扣热题100Day06:20. 有效的括号,21. 合并两个有序链表,22. 括号生成
20. 有效的括号 题目链接:20. 有效的括号 - 力扣(Leetcode) 思路:使用栈 (1)遇到左括号就将其对应的右括号压入到栈中 (2)如果遇到右括号 a. 如果弹出的元素与当前不等ÿ…...
【Yolov5】保姆级别源码讲解之-推理部分detect.py文件
推理部分之detect.py文件讲解1.下载Yolov5的源码2. 主函数讲解3.文件标头的注释4. main函数的5. run函数5.1 第一块参数部分5.2第二块,传入数据预处理5.3 第三块创建文件夹5.4 第四块 加载模型的权重5.5 第五块 Dataloader 加载模块5.6 第六块 推理部分 Run inferen…...
OpenClaw版本升级指南:Qwen3-4B模型平滑迁移到v2.0
OpenClaw版本升级指南:Qwen3-4B模型平滑迁移到v2.0 1. 为什么需要这份升级指南 上周五晚上,当我准备将本地OpenClaw从v1.8升级到v2.0时,原本以为只需要简单执行npm update就能搞定。没想到这个看似常规的操作,却让我的Qwen3-4B模…...
新一代指控系统依然是:人机环
AI是强大的“赋能器”和“加速器”,但指挥的艺术、责任和最终决断必须由人掌握。基于俄乌、美以伊博弈的案例,构建新一代“人机环境融合”体系化指控系统的具体实践路径已经清晰。AI的定位:从“自动化”到“智能化辅助”美军Maven系统&#x…...
为什么选择Sammy.js:轻量级JavaScript框架的终极优势解析
为什么选择Sammy.js:轻量级JavaScript框架的终极优势解析 【免费下载链接】sammy Sammy is a tiny javascript framework built on top of jQuery, Its RESTful Evented Javascript. 项目地址: https://gitcode.com/gh_mirrors/sa/sammy 在当今前端开发领域&…...
三菱现代自动擦窗机器人PLC软件:后发产品介绍及技术细节
三菱 现代自动擦窗机器人PLC软件 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面 界面多种组态可供选择上周刚帮一个三菱现代贴牌擦窗机的小客户把新软件迭代完,顺便攒了一套带人话解释的梯形图、不…...
OpenClaw学习助手方案:Qwen2.5-VL-7B解析教材插图生成记忆卡片
OpenClaw学习助手方案:Qwen2.5-VL-7B解析教材插图生成记忆卡片 1. 为什么需要AI辅助学习工具 去年备考专业认证时,我发现自己总在重复低效的学习循环——花大量时间手动整理教材图表中的关键数据,再誊写到Anki卡片上。这种机械劳动不仅耗时…...
OpenClaw+千问3.5-9B智能家居:自然语言控制HomeAssistant
OpenClaw千问3.5-9B智能家居:自然语言控制HomeAssistant 1. 为什么需要自然语言控制智能家居? 去年装修新房时,我安装了HomeAssistant系统来控制全屋灯光、空调和窗帘。虽然手机App能实现远程控制,但每次都要打开应用、找到对应…...
2026年4月如何集成OpenClaw?华为云保姆级10分钟安装及百炼APIKey配置方法
2026年4月如何集成OpenClaw?华为云保姆级10分钟安装及百炼APIKey配置方法。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉,让AI在企业…...
STM32环境检测系统设计与物联网应用
1. 项目概述这个基于STM32的环境检测系统是我去年为一个工业客户开发的解决方案,经过3个月的迭代优化已经稳定运行了半年多。系统通过多种传感器实时监测环境参数,并将数据上传至OneNet云平台,实现了本地和远程的双重监控。提示:项…...
重构求职效率:boss_batch_push批量投递工具的颠覆性价值
重构求职效率:boss_batch_push批量投递工具的颠覆性价值 【免费下载链接】boss_batch_push Boss直聘批量投简历,解放双手 项目地址: https://gitcode.com/gh_mirrors/bo/boss_batch_push boss_batch_push是一款专为Boss直聘平台设计的开源自动化投…...
微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程
微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.co…...
