当前位置: 首页 > news >正文

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你以为这样就完了&#xff1f;倒序排序前言 之前&#xff0c;针对Stream链式编程中的几个方法做了大致的说明。详情可以参考&#xff1a; J…...

ubuntu:20.04编译arrow

1)拉取代码 git clone https://github.com/apache/arrow.git 2&#xff09;切换分支 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如果纯做业务测试的话,在测试行业有出路吗?

直接抛出我的结论&#xff1a;手工做业务类测试&#xff0c;没有前途。 个人建议赶紧从业务测试跳出来&#xff0c;立即学习代码&#xff0c;走自动化测试方向。目前趋势&#xff0c;业务测试需要用自动化做。 为了让大家能够信服我的观点&#xff0c;本文将从以下方面进行阐…...

golang grpc ssl

无CA场景 在不考虑CA的场景下呢&#xff0c;client有client.key和client.crt&#xff0c;server有server.key和server.crt&#xff0c;生成方式可以如下&#xff1a; $ 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.安装驱动 自动安装驱动步骤&#xff1a; 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 . 复制一个目录到当前工作目录&#xff08;.代表当前目录…...

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 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否…...

Java线程池使用与原理解析(线程池优点、使用方法、参数含义及线程池运转机制)

为什么要使用线程池&#xff1f; JDK1.5后JUC包添加了线程池相关接口&#xff0c;在Java诞生之初并没有线程池这个概念。刚开始Java程序都是自行创建线程去处理任务。随着应用使用的线程越来越多&#xff0c;JDK开发者们发现有必要使用一个统一的类来管理这些线程&#xff0c;…...

mybatis入门配置

mybatis mybatis是一款持久层框架&#xff0c;用于简化JDBC开发 持久层&#xff1a;负责将数据保存到数据库的那一层代码JavaEE的三层架构&#xff1a;表现层、业务层、持久层、&#xff0c;就相当与mvc设计模式过程中的Controller、service、dao 1.创建一个maven模块&#…...

黑客入门(超级详细版)

据我了解&#xff0c;“黑客”大体上应该分为“正”、“邪”两类&#xff0c;正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善&#xff0c;而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情&#xff0c;因为邪派黑客所…...

Java多线程(三)---synchronized、Lock和volatile

Java内存模型&#xff08;非JVM&#xff09;Java内存模型(Java Memory Model简称JMM)&#xff0c;是一种共享内存模型&#xff0c;是多线程的东西&#xff0c;并不是JVM&#xff08;Java Virtual Machine(Java虚拟机)的缩写&#xff09;&#xff0c;这是俩玩意儿&#xff01;&a…...

JVM-Java内存区域

运行时数据区&#xff1a;1、程序计数器&#xff1a;当前线程所执行的字节码指令的行号指示器。在Java虚拟机的概念模型里&#xff0c;字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令&#xff0c;它是程序控制流的指示器&#xff0c;分支、循环…...

毕业季,毕业论文查重,paper系列五个免费查重网站推荐

推荐五个常用的免费查重网站 注意&#xff1a; &#xff08;1&#xff09;这些网站基本上都可以通过关注公众号或者转发等来获取免费查重机会&#xff0c;但有些也会有字数限制。每个网站的数据库可能不同&#xff0c;所以建议大家多换几个平台查一查&#xff0c;反正是免费的…...

破解票房之谜:为何高票房电影绕不过“猫眼们”?

如此火爆的春节档很多&#xff0c;如此毁誉参半的春节档鲜有。2023开年&#xff0c;集齐张艺谋、沈腾的《满江红》&#xff0c;以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十&#xff0c;为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…...

订单服务-----遇到的问题及解决方案

订单服务的问题及解决方案问题1&#xff1a;Feign远程调用时丢失请求头编辑出现这个Feign远程调用时丢失请求头的问题是因为Feign在远程调用的时候会创建一个新的请求&#xff0c;但是这个新的请求里啥都没有&#xff0c;没有cookie值&#xff0c;而这个cookie值里有成功登录后…...

项目经理如何度量项目?及项目度量指标实例【静说】

度量项目是项目经理的一个重要职责&#xff0c;通过度量项目&#xff0c;项目经理可以了解项目的进展情况&#xff0c;及时发现问题并采取相应的措施&#xff0c;以确保项目能够按时、按质、按预算完成。 分享给大家一些常见的项目度量指标&#xff1a; 1. 项目进度&#xff…...

我们应该如何优雅的处理 React 中受控与非受控

引言 大家好&#xff0c;我是19组清风。有段时间没有和大家见面了&#xff0c;最近因为有一些比较重要的事情&#xff08;陪女朋友和换了新公司&#xff09;在忙碌所以销声匿迹了一小段时间&#xff0c; 后续会陆陆续续补充之前构建 & 编译系列中缺失的部分&#xff0c;提…...

力扣热题100Day06:20. 有效的括号,21. 合并两个有序链表,22. 括号生成

20. 有效的括号 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;Leetcode&#xff09; 思路&#xff1a;使用栈 &#xff08;1&#xff09;遇到左括号就将其对应的右括号压入到栈中 &#xff08;2&#xff09;如果遇到右括号 a. 如果弹出的元素与当前不等&#xff…...

【Yolov5】保姆级别源码讲解之-推理部分detect.py文件

推理部分之detect.py文件讲解1.下载Yolov5的源码2. 主函数讲解3.文件标头的注释4. main函数的5. run函数5.1 第一块参数部分5.2第二块&#xff0c;传入数据预处理5.3 第三块创建文件夹5.4 第四块 加载模型的权重5.5 第五块 Dataloader 加载模块5.6 第六块 推理部分 Run inferen…...

无重叠区间-力扣435-java贪心策略

一、题目描述给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。示例 1:输入: intervals [[1,2],[2,3],[3,4],[1,3]]输出: 1解释: 移除 [1,3] 后&#xff0c;剩下的区间没有重叠。…...

Python使用VTK对容积超声图像进行体绘制(三维重建)

目录VTK简介什么是体绘制&#xff1f;体绘制效果图流程CodeQ&AReferenceVTK简介 VTK&#xff08;Visualization Toolkit&#xff09;是一个用于3D计算机图形学、图像处理和可视化的开源软件包。它包括一组C类和工具&#xff0c;可以让用户创建和处理复杂的3D图形和数据可视…...

JAVA设计模式之工厂模式讲解

目录 前言 开始表演 前言 Java中使用工厂模式的主要原因是为了实现代码的灵活性和可维护性。工厂模式是一种创建型设计模式&#xff0c;它提供了一种将对象的创建和使用进行分离的方式。具体来说&#xff0c;工厂模式可以将对象的创建过程封装在一个独立的工厂类中&#xff…...

近万字概述L3及以上自动驾驶故障运行和故障安全机制

本文描述了对ADS的FO和FS机制的评估方法。当系统不能按预期运行时,ADS将使用FO和FS机制。这些机制使ADS能够在最大程度上达到使车辆及其乘员脱离危险的MRC。定义、测试和验证实现MRC的FO和FS策略是确保ADS安全运行和部署的重要步骤。 MRC在SAE J3016中被定义为: 用户或ADS在…...

kafka入门到精通

文章目录一、kafka概述&#xff1f;1.定义1.2消息队列1.2.1 传统消息队列的使用场景1.2.2 消息队列好处1.2.3 消息队列两种模式1.3 kafka基础架构二、kafka快速入门1.1使用docker-compose安装kafka1.2测试访问kafka-manager1.3 查看kafka版本号1.4 查看zookeeper版本号1.5 扩展…...

es-09模糊查询

模糊查询 前缀搜索&#xff1a;prefix 概念&#xff1a;以xx开头的搜索&#xff0c;不计算相关度评分。 注意&#xff1a; 前缀搜索匹配的是term&#xff0c;而不是field。前缀搜索的性能很差前缀搜索没有缓存前缀搜索尽可能把前缀长度设置的更长 语法&#xff1a; GET <ind…...

57 - 深入解析任务调度

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题1.1 思考1.2 实例分析&#xff1a;问题分析及解决2. 深入讨论2.1 任务调度的定义2.2 关于调度算法的分类2.3 什么时候进行任务调度2.4 任务的分类2.5 关于优先级调度2.6 问题2.7 调度算法的终极目标2.8 课后扩展1. 问题 系统…...

CAN总线开发一本全(3) - 微控制器集成的FlexCAN外设

CAN总线开发一本全&#xff08;3&#xff09; - 微控制器集成的FlexCAN外设 苏勇&#xff0c;2023年2月 文章目录CAN总线开发一本全&#xff08;3&#xff09; - 微控制器集成的FlexCAN外设引言硬件外设模块系统概要总线接口单元 - 寄存器清单数据结构 - 消息缓冲区MB初始化过…...

Elasticsearch7.8.0版本进阶——段合并

目录一、段的概述1.1、段的概念1.2、段的缺点1.3、如何解决段数量暴增问题二、段合并的流程三、段合并的注意事项一、段的概述 1.1、段的概念 每一 段 本身都是一个倒排索引。 1.2、段的缺点 由于自动刷新流程每秒会创建一个新的段 &#xff0c;这样会导致短时间内的段数量…...

Java版贪食蛇游戏

技术&#xff1a;Java等摘要&#xff1a;近年来Java作为一种新的编程语言&#xff0c;以其简单性、可移植性和平台无关性等优点&#xff0c;得到了广泛地应用&#xff0c;特别是Java与万维网的完美结合&#xff0c;使其成为网络编程和嵌入式编程领域的首选编程语言。MyEclipse是…...