关于Comparator使用说明
1. 源码分析
1.1 介绍
@FunctionalInterface
public interface Comparator
比较功能,对一些对象的集合施加了一个整体排序 。 可以将比较器传递给排序方法(如Collections.sort
或Arrays.sort
),以便对排序顺序进行精确控制。 比较器还可以用来控制某些数据结构(如顺序sorted sets或sorted maps ),或对于不具有对象的集合提供的排序natural ordering 。
通过比较c上的一组元素S的确定的顺序对被认为是与equals一致当且仅当c.compare(e1, e2)==0具有用于S每e1和e2相同布尔值e1.equals(e2)。
当使用能够强制排序不一致的比较器时,应注意使用排序集(或排序图)。 假设具有显式比较器c的排序集(或排序映射)与从集合S中绘制的元素(或键) 一起使用 。 如果88446235254451上的c强制的排序与equals不一致,则排序集(或排序映射)将表现为“奇怪”。 特别是排序集(或排序图)将违反用于设置(或映射)的一般合同,其按equals定义。
例如,假设一个将两个元件a和b ,使得(a.equals(b) && c.compare(a, b) != 0)到空TreeSet与比较c 。 因为a和b与树集的角度不相等,所以第二个add操作将返回true(并且树集的大小将增加),即使这与Set.add方法的规范相反。
注意:这通常是一个好主意比较,也能实现java.io.Serializable,因为它们可能被用来作为排序的序列化数据结构的方法(如TreeSet , TreeMap )。 为了使数据结构成功序列化,比较器(如果提供)必须实现Serializable 。
对于数学上的倾斜,即限定了施加顺序 ,给定的比较器c上一组给定对象的S强加关系式为:
{(x, y) such that c.compare(x, y) <= 0}.
这个总订单的商是:
{(x, y) such that c.compare(x, y) == 0}.
它从合同compare,该商数是S的等价关系紧随其后,而强加的排序是S, 总订单 。 当我们说S上的c所规定的顺序与等于一致时,我们的意思是排序的商是由对象equals(Object)
方法定义的等价关系:
{(x, y) such that x.equals(y)}.
与Comparable不同,比较器可以可选地允许比较空参数,同时保持对等价关系的要求。
1.2 方法
1.2.1
2. 简单应用
List<UserVO> list = new ArrayList<>();//返回 对象集合以类属性一升序排序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime));//返回 对象集合以类属性一降序排序 注意两种写法//先以属性一升序,结果进行属性一降序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime).reversed());//以属性一降序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime,Comparator.reverseOrder()));//返回 对象集合以类属性一升序 属性二升序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime).thenComparing(UserVO::getRegTime));//返回 对象集合以类属性一降序 属性二升序 注意两种写法//先以属性一升序,升序结果进行属性一降序,再进行属性二升序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime).reversed().thenComparing(UserVO::getRegTime));//先以属性一降序,再进行属性二升序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime,Comparator.reverseOrder()).thenComparing(UserVO::getRegTime));//返回 对象集合以类属性一降序 属性二降序 注意两种写法//先以属性一升序,升序结果进行属性一降序,再进行属性二降序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime).reversed().thenComparing(UserVO::getRegTime,Comparator.reverseOrder()));//先以属性一降序,再进行属性二降序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime,Comparator.reverseOrder()).thenComparing(UserVO::getRegTime,Comparator.reverseOrder()));//返回 对象集合以类属性一升序 属性二降序 注意两种写法//先以属性一升序,升序结果进行属性一降序,再进行属性二升序,结果进行属性一降序属性二降序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime).reversed().thenComparing(UserVO::getRegTime).reversed());//先以属性一升序,再进行属性二降序list.stream().sorted(Comparator.comparing(UserVO::getLoginTime).thenComparing(UserVO::getRegTime,Comparator.reverseOrder()));
通过以上例子我们可以发现,两种排序是完全不一样的,,一定要区分开来,2更好理解,建议使用2
- Comparator.comparing(类::属性一).reversed();
是得到排序结果后再排序
- Comparator.comparing(类::属性一,Comparator.reverseOrder());
是直接进行排序,很多人会混淆导致理解出错
注意
1. 空值排序Comparator.nullsLast()
与Comparator.nullsFirst()
nullsFirst
排序后,空值在后,非空在前,nullsLast
排序后,空值在前,非空值在后
关于Comparator使用说明相关推荐
- 菜鸟学JAVA之——常用类(StringBuffer、StringBuilder、Comparable、Comparator等)
文章目录 常用类 字符串相关的类 一.String类及常用方法 二.StringBuffer.StringBuilder JDK 8 之前的日期时间API 一.System静态方法 二.Date类 三 ...
- MINIO使用说明(附文件上传下载)
一.项目信息说明 minio Server版本:linux-amd64/minio 与 windows-amd64/minio.exe minio Client版本:linux-amd64/mc 与 ...
- abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...
高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF 高性能计算平台ABAQUS 任务调度使用说明 作者:陈林 E-Mail:chenlin@ 日期:2017-1-10 ...
- linux 文件拷贝并替换,Linux_cmd replace 文件替换使用说明,帮助信息: 复制代码 代码如 - phpStudy...
cmd replace 文件替换使用说明 帮助信息: 复制代码 代码如下: 替换文件. REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [ ...
- Comparator 和 Comparable
Comparator 和 Comparable 比较 Comparable是排序接口:若一个类实现了Comparable接口,就意味着"该类支持排序". 而Comparator是比 ...
- Simple Dynamic Strings(SDS)源码解析和使用说明二
在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...
- java 比较器comparator_Java中比较器的使用Compare和Comparator
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...
- Delphi开发的IOCP测试Demo以及使用说明。
Delphi开发的IOCP,此为压力测试Demo和使用说明.
- oracle database link mysql_oracle database link使用说明
oracle database link使用说明 作用: 将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象. 简易语法: CREATE [PUBLIC] ...
最新文章
- SAP MM 采购附加费在收货以及发票过账时候的会计分录
- JavaScript前端框架的思考
- GAN作用——在我做安全的看来,就是做数据拟合、数据增强
- Gil Zilberfeld问答:敏捷产品的规划与管理
- 熟读《阿里巴巴java开发手册》(六、工程结构,七、 设计规约,专有名词解释)
- HBase get查询命令及VERSIONS版本
- c语言gets和getchar区别,c语言中关于getchar()、getchar()和gets().......
- 当年发明hello, world的大神,后来怎么样了?
- vb mysql边记录边统计_VB与Access连接,检索、核对、处理数据
- 会议室分配时间最长_突破大设计1:时间分配
- 网页设计之 HTML代码的理解.
- python底层原理讲解_python底层原理
- [推荐]一款非常方便好用的输入法--拼音加加
- php 调用speex解码库,怎么增加speex解码库
- 2022新版iApp工具箱源码+有聊天系统等等
- python while循环例题鸡兔同笼_使用函数嵌套和循环枚举解决鸡兔同笼问题(解数学题学Python编程)...
- 【精华】PB函数大全
- CSS的选择器(超详细!!)
- word文档如何画线条流程图_word怎么画图,如何用word制作流程图
- 数据结构与算法 python版 之 递归三定律
热门文章
- 【实战】我背着女朋友,用 Python 偷偷抓取了她的行踪
- 找不到类型或命名空间名称[重复]
- 通过shell脚本获取日期,并赋给变量
- STM32F429I-DISCO 和GPS的亲热接触
- python可以制作网页吗_自己制作网页的网站(python制作网页)
- 计算机:游戏25关,烧脑吃鸡大作战第25关怎么通关 第25关通关技巧介绍
- 无线组网168元的4G路由器真实价值多少?蒲公英4G路由器X4C测评
- 学霸如何使用计算机,清华计算机学霸王浩宇:这四个学习方法非常实用
- java中创建线程的四种方式及线程池详解
- java序列化方案对比