Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】

针对集合排序,java8可以用Stream流的sorted()进行排序。
示例Bean
以下我们会使用这个Bean来做示例。

public class Order {private String weight;private Double price;private String dateStr;//忽略getter、setter、构造方法、toString
}

字段排序
首先是比较器 Comparator,形式如下:

Comparator<对象的类名> comparator = Comparator.comparing(对象的类名::get方法名, 升序或降序)

1. 排序常用的api:
naturalOrder()表示自然排序(一般是升序),数字的自然顺序是数字顺序,字符串按字母顺序排序,日期按时间顺序排序。
reverseOrder()表示 降序。
nullsLast()表示如果属性为null,就放到最后面。
nullsFirst()表示如果属性为null,就放到最前面。
升序如下:
naturalOrder()表示自然排序(一般是升序),没有处理属性的null值,排序时可能会空指针

Comparator<Order> comparator1 = Comparator.comparing(Order::getDateStr, Comparator.naturalOrder());
List<Order> orderList1 = list.stream().sorted(comparator1).collect(Collectors.toList());
等同于 List<Order> orderList1 = list.stream().sorted(Comparator.comparing(Order::getDateStr)).collect(Collectors.toList());
System.out.println("orderList1:"+orderList1);

降序如下:

Comparator.reverseOrder()表示 降序,没有处理属性的null值,排序时可能会空指针
Comparator<Order> comparator2 = Comparator.comparing(Order::getDateStr, Comparator.reverseOrder());
List<Order> orderList2 = list.stream().sorted(comparator2).collect(Collectors.toList());
System.out.println("orderList2:"+orderList2);

Comparator.nullsLast()表示如果属性为null,就放到最后面,Comparator.nullsFirst()表示如果属性为null,就放到最前面。

Comparator<Order> comparator3 =  Comparator.comparing(Order::getDateStr, Comparator.nullsLast(naturalOrder()) );
List<Order> orderList3 = list.stream().sorted(comparator3).collect(Collectors.toList());
System.out.println("orderList3:"+orderList3);

2.java8多字段排序
有时我们还需要对多个字段进行排序。
多个字段排序,先对第一个排序字段排序,当第一个排序字段相同时,会使用第二个排序字段进行排序。

多字段排序的api
多个字段排序的格式

Comparator<对象的类名> comparator = Comparator.comparing(对象的类名::方法名1, 升序或降序).thenComparing(Comparator.comparing(对象的类名::方法名2, 升序或降序));

如果是三个以上的字段排序,就继续用 thenComparing 连接。

示例如下:
先按第一个字段降序,再按第二个字段降序,如果属性为null,就放到最后面。

Comparator<Order> comparator5 = Comparator.comparing(Order::getDateStr, Comparator.nullsLast(Comparator.reverseOrder())).thenComparing(Order::getPrice, Comparator.nullsLast(Comparator.reverseOrder()));
List<Order> orderList5 = list.parallelStream().sorted(comparator5).collect(Collectors.toList());
System.out.println("orderList5:"+ orderList5);

reversed()和Comparator.reverseOrder()的区别:
Comparator.comparing(对象的类名::属性的方法名).reversed();
Comparator.comparing(对象的类名::属性的方法名,Comparator.reverseOrder());

reversed()是得到排序结果后再反转,
Comparator.reverseOrder()是对属性按照降序进行排序,
reversed()在多字段排序时,很容易混乱,不建议使用。
Comparator.reverseOrder()更好理解,也更好用些。

public class SortedDemo {/*** naturalOrder()表示自然排序(一般是升序),* Comparator.reverseOrder()表示 降序。** nullsLast()表示如果属性为null,就放到最后面。* nullsFirst()表示如果属性为null,就放到最前面。**/public static void order() {//设置 order对象属性,以下是lombok的写法,相当于 setterOrder order1=Order.builder().dateStr("2021-10-01 00:00:00").price(33.3).build();Order order2=Order.builder().dateStr("2021-10-01 00:00:00").price(1.3).build();Order order3=Order.builder().dateStr("2021-10-01 00:00:00").price(55.3).build();Order order4=Order.builder().dateStr("2021-12-01 00:00:00").price(55.3).build();//添加null测试Order order5=Order.builder().dateStr(null).price(null).build();List<Order> list= new ArrayList<>();list.add(order1);list.add(order2);list.add(order3);list.add(order4);list.add(order5);// ==========================================================================//naturalOrder()表示自然排序(一般是升序),没有处理null,排序时可能会空指针Comparator<Order> comparator1 = Comparator.comparing(Order::getDateStr, Comparator.naturalOrder());
//        List<Order> orderList1 = list.stream().sorted(comparator1).collect(Collectors.toList());
//        System.out.println("orderList1:"+orderList1);// ==========================================================================//Comparator.reverseOrder表示 降序,没有处理null,排序时可能会空指针Comparator<Order> comparator2 = Comparator.comparing(Order::getDateStr, Comparator.reverseOrder());
//        List<Order> orderList2 = list.stream().sorted(comparator2).collect(Collectors.toList());
//        System.out.println("orderList2:"+orderList2);// ==========================================================================//Comparator.nullsLast表示如果属性为null,就放到最后面Comparator<Order> comparator3 =  Comparator.comparing(Order::getDateStr, Comparator.nullsLast(naturalOrder()) );List<Order> orderList3 = list.stream().sorted(comparator3).collect(Collectors.toList());
//        System.out.println("orderList3:"+orderList3);// ==========================================================================//nullsFirst表示如果属性为null,就放到最前面。Comparator<Order> comparator4 = Comparator.comparing(Order::getDateStr, Comparator.nullsFirst(Comparator.reverseOrder()));List<Order> orderList4 = list.stream().sorted(comparator4).collect(Collectors.toList());
//        System.out.println("orderList4:"+ orderList4);// ==========================================================================//先按第一个字段降序,再按第二个字段降序,如果属性为null,就放到最后面。//输出: [Order(price=55.3, dateStr=2021-12-01 00:00:00),//Order( price=55.3, dateStr=2021-10-01 00:00:00),//Order(price=33.3, dateStr=2021-10-01 00:00:00),//Order(price=1.3, dateStr=2021-10-01 00:00:00)]Comparator<Order> comparator5 = Comparator.comparing(Order::getDateStr, Comparator.nullsLast(Comparator.reverseOrder())).thenComparing(Order::getPrice, Comparator.nullsLast(Comparator.reverseOrder()));List<Order> orderList5 = list.parallelStream().sorted(comparator5).collect(Collectors.toList());System.out.println("orderList5:"+ orderList5);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职场新员工倒挂老员工工资

职场的工资倒挂和工资构成 一个公司招新员工要开多少工资 主要取决于其他大厂出多少钱以及当年就业市场的行情。职场中常出现工资倒挂现象&#xff0c;即新员工的工资高于老员工。公司宁愿高薪招新员工而不给老员工加工资&#xff0c;主要是因为新员工的工资由市场决定&#…

【优选算法专栏】专题十:哈希表(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

[yotroy.cool]Haskell笔记一 —— 入门 算数 运算符 未定义变量 列表 字符串 类型

个人博客https://www.yotroy.cool/&#xff0c;欢迎关注我哦&#xff5e; 添加模块 ghci> :module Data.Ratio算数 - * / ** ^ % 基本的 ghci> 7.0 / 2.0 3.5 ghci> 7 / 2 3.5ghci> 2 2 4 ghci> () 2 2 4** 和 ^ - ** 可用于浮点数幂 ghci> 2.2**3.3 …

分治法python

分治法(Divide and Conquer)是一种重要的算法设计技巧,它将一个难以直接解决的问题分解成两个或更多的相同或相似的子问题,递归地解决这些子问题,然后将子问题的解组合起来,从而解决原问题。 以求最大值为例,假设我们有一个整数数组,我们想找到数组中的最大值。使用分…

mutable关键字的作用(c++)

常成员变量、常成员函数与常对象 常成员变量 声明为常成员变量的成员变量&#xff0c;在对象被创建后就不能被修改常成员变量必须在对象的构造函数初始化列表中赋值&#xff0c;不能在构造函数体中赋值初始化列表的执行是在函数体执行之前就执行了的。上面这种写法和下面的写…

卫星遥感影像在农业方面的应用及评价

一、引言 随着科技的进步&#xff0c;卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点&#xff0c;为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍&#xff0c;并通过具体案例进行说明。 二、…

(二)ffmpeg 下载安装以及拉流推流示例

一、ffmpeg下载安装 官网&#xff1a;https://www.ffmpeg.org/ 源码下载地址&#xff1a;https://www.ffmpeg.org/download.html#releases 下载源码压缩包 下载完成之后解压并在该目录下打开命令窗口 安装依赖环境&#xff1a; sudo apt-get install build-essential nasm …

【CAD建模号】学习笔记(二)——工作区

工作区介绍 工作区由[工具提示]&#xff0c;[自适应网格]&#xff0c;[自适应坐标轴]&#xff0c;[参考坐标轴]&#xff0c;[绘制的图形]组成。 一、工具提示 工具提示是提示当前工具的操作步骤&#xff0c;同时也提供了更加精确的参数输入方式建模、绘图时直接生成面&#x…

规则系统架构

规则系统架构 目录概述需求&#xff1a; 设计思路实现思路分析1.规则系统架构2. 规则系统架构优势 性能参数测试&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,mak…

计算机常识

常见屏幕比例&#xff1a;16&#xff1a;9和16&#xff1a;10 分辨率&#xff1a;屏幕上水平和垂直方向的像素数量&#xff0c;决定了屏幕显示图像的细致程度和清晰度 简称 HD(High Definition)&#xff1a;高清 FHD(Full High Definition)&#xff1a;全高清 QHD (Quarter H…

Linux防止暴力破解密码脚本

1.认识记录linux记录安全的日志 [roottestpm ~]# cd /var/log/ [roottestpm log]# ls | grep secure secure 2.该日志的内容查看 [roottestpm log]# tail -f secure #表示ssh身份验证失败 Aug 29 23:35:03 testpm sshd[111245]: pam_unix(sshd:auth): authentication fa…

Java内存泄漏内存溢出

1.定义 OOM内存溢出是指应用程序尝试使用更多内存资源&#xff0c;而系统无足够的内存&#xff0c;导致程序崩溃。 内存泄漏是指应用程序中分配的内存未能被正确释放&#xff0c;导致系统中的可用内存逐渐减少。 2.内存泄漏的原因 可能包括对象引用未被释放、缓存未被清理等。 …

【MYSQL】其他索引的创建使用方式

MySQL其他索引的创建使用方式 前面的案例中&#xff0c;聊到了咱们有三种方式创建索引&#xff0c;在创建时可通过INDEX、KEY两个关键字创建&#xff0c;但这种方式建立的索引仅是普通索引&#xff0c;接着再来聊一聊MySQL数据库其他类型的索引该如何创建以及使用。 但不管是何…

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域&#xff0c;比较常用的轻量化软件交付方式&#xff0c;该技术是将3D应用等大模型的算力执行放在了服务器端&#xff0c;而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多&#xff0c;实时云渲染平台的国产信创化…

学习基于pytorch的VGG图像分类 day4

注&#xff1a;本系列博客在于汇总CSDN的精华帖&#xff0c;类似自用笔记&#xff0c;不做学习交流&#xff0c;方便以后的复习回顾&#xff0c;博文中的引用都注明出处&#xff0c;并点赞收藏原博主. 目录 VGG模型检测 一&#xff1a;导入必要的库和模块 二&#xff1a;主函数…

Games101Homework【6】Acceleration structure(Including framework analysis)

Code Analysis&#xff1a; friend&#xff1a; C中友元&#xff08;友元函数和友元类&#xff09;的用法和功能_friend class a<b>-CSDN博客 [C&#xff1a;不如Coding]&#xff08;11&#xff09;&#xff1a;友元函数与友元类_哔哩哔哩_bilibili Here is a simple…

Rust开发笔记 | 系统编程的守护神

在如今这个信息技术不断发展的时代&#xff0c;系统编程语言演进的步伐从未停歇。Rust&#xff0c;作为现代化的系统编程语言&#xff0c;正凭借其出色的性能、安全性和并发处理能力赢得编程界的广泛赞誉。有别于传统的系统编程语言&#xff0c;Rust在保证高性能的同时&#xf…

二维数组---刷题

一维数组不想更了&#xff0c;弄点二维数组&#xff01; 1.对角线 已知一个6*6的矩阵&#xff0c;把矩阵两条对角线上的元素加上10&#xff0c;然后输出这个新矩阵。 思路 题目简单&#xff0c;6*636&#xff0c;可以得知有36个元素。数组就定义成a[7][7]&#xff0c;难点在与…

软考数据库---3.关系数据库

3.1 名词 属性分类 数据库实体属性分类主要包括以下几个方面&#xff1a; 标识属性 (Key Attribute / Identifier): 这些属性是用来唯一识别实体实例的关键属性&#xff0c;也称为主键&#xff08;Primary Key&#xff09;。在数据库表中&#xff0c;每个实体的实例&#xff0…

Linux--gcc和g++的区别

gcc 和 g 都是 GNU 编译器套件&#xff08;GNU Compiler Collection&#xff09;中的一部分&#xff0c;但它们用于编译不同类型的源代码。 gcc: gcc 是 GNU C Compiler 的缩写&#xff0c;主要用于编译 C 语言源代码。它能够将 C 代码编译成可执行程序或者目标代码。 g: g 是…