1. 源码分析

1.1 介绍

@FunctionalInterface
public interface Comparator
比较功能,对一些对象的集合施加了一个整体排序 。 可以将比较器传递给排序方法(如Collections.sortArrays.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

  1. Comparator.comparing(类::属性一).reversed(); 是得到排序结果后再排序
  2. Comparator.comparing(类::属性一,Comparator.reverseOrder()); 是直接进行排序,很多人会混淆导致理解出错

注意

1. 空值排序Comparator.nullsLast()Comparator.nullsFirst()

nullsFirst排序后,空值在后,非空在前,nullsLast排序后,空值在前,非空值在后

关于Comparator使用说明相关推荐

  1. 菜鸟学JAVA之——常用类(StringBuffer、StringBuilder、Comparable、Comparator等)

    文章目录 常用类 字符串相关的类 一.String类及常用方法 二.StringBuffer.StringBuilder JDK 8 之前的日期时间API 一.System静态方法 二.Date类 三 ...

  2. MINIO使用说明(附文件上传下载)

    一.项目信息说明 minio Server版本:linux-amd64/minio 与 windows-amd64/minio.exe minio Client版本:linux-amd64/mc 与 ...

  3. abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...

    高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF 高性能计算平台ABAQUS 任务调度使用说明 作者:陈林 E-Mail:chenlin@ 日期:2017-1-10 ...

  4. linux 文件拷贝并替换,Linux_cmd replace 文件替换使用说明,帮助信息: 复制代码 代码如 - phpStudy...

    cmd replace 文件替换使用说明 帮助信息: 复制代码 代码如下: 替换文件. REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [ ...

  5. Comparator 和 Comparable

    Comparator 和 Comparable 比较 Comparable是排序接口:若一个类实现了Comparable接口,就意味着"该类支持排序". 而Comparator是比 ...

  6. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  7. java 比较器comparator_Java中比较器的使用Compare和Comparator

    Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...

  8. Delphi开发的IOCP测试Demo以及使用说明。

    Delphi开发的IOCP,此为压力测试Demo和使用说明.

  9. oracle database link mysql_oracle database link使用说明

    oracle database link使用说明 作用: 将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象. 简易语法: CREATE [PUBLIC] ...

最新文章

  1. SAP MM 采购附加费在收货以及发票过账时候的会计分录
  2. JavaScript前端框架的思考
  3. GAN作用——在我做安全的看来,就是做数据拟合、数据增强
  4. Gil Zilberfeld问答:敏捷产品的规划与管理
  5. 熟读《阿里巴巴java开发手册》(六、工程结构,七、 设计规约,专有名词解释)
  6. HBase get查询命令及VERSIONS版本
  7. c语言gets和getchar区别,c语言中关于getchar()、getchar()和gets().......
  8. 当年发明hello, world的大神,后来怎么样了?
  9. vb mysql边记录边统计_VB与Access连接,检索、核对、处理数据
  10. 会议室分配时间最长_突破大设计1:时间分配
  11. 网页设计之 HTML代码的理解.
  12. python底层原理讲解_python底层原理
  13. [推荐]一款非常方便好用的输入法--拼音加加
  14. php 调用speex解码库,怎么增加speex解码库
  15. 2022新版iApp工具箱源码+有聊天系统等等
  16. python while循环例题鸡兔同笼_使用函数嵌套和循环枚举解决鸡兔同笼问题(解数学题学Python编程)...
  17. 【精华】PB函数大全
  18. CSS的选择器(超详细!!)
  19. word文档如何画线条流程图_word怎么画图,如何用word制作流程图
  20. 数据结构与算法 python版 之 递归三定律

热门文章

  1. 【实战】我背着女朋友,用 Python 偷偷抓取了她的行踪
  2. 找不到类型或命名空间名称[重复]
  3. 通过shell脚本获取日期,并赋给变量
  4. STM32F429I-DISCO 和GPS的亲热接触
  5. python可以制作网页吗_自己制作网页的网站(python制作网页)
  6. 计算机:游戏25关,烧脑吃鸡大作战第25关怎么通关 第25关通关技巧介绍
  7. 无线组网168元的4G路由器真实价值多少?蒲公英4G路由器X4C测评
  8. 学霸如何使用计算机,清华计算机学霸王浩宇:这四个学习方法非常实用
  9. java中创建线程的四种方式及线程池详解
  10. java序列化方案对比