Comparator接口方法详解

news/2024/4/29 6:44:26/文章来源:https://blog.csdn.net/weixin_54158370/article/details/137152710

Comparator接口方法详解

文章目录

    • Comparator接口方法详解
      • 1.静态方法
        • 1.comparing
        • 2.naturalOrder、reverseOrder
        • 3.nullsFirst、nullsLast
      • 2.默认方法
        • 1.compare、reversed
        • 2.thenComparing
        • 测试示例

1.静态方法

1.comparing
<T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor)
<T, U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor,Comparator<? super U> keyComparator)    
<T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)   
<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor)
<T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) 

比较器构建

 //自然正向排序,接收一个类型的key,返回一个按该key进行比较的比较器Comparator<DemoObj> comparing = Comparator.comparing(DemoObj::getAmount);Comparator<DemoObj> comparingInt = Comparator.comparingInt(DemoObj::getAmount);Comparator<DemoObj> comparingDouble = Comparator.comparingDouble(DemoObj::getAmount);Comparator<DemoObj> comparingLong = Comparator.comparingLong(DemoObj::getAmount);//接收一个类型的key,第二个参数为自定义排序规则,返回比较器Comparator<DemoObj> comparing1 = Comparator.comparing(DemoObj::getAmount, (x, y) -> x.compareTo(y));

使用示例

//自然正向排序,用金额排序返回金额List<Integer> collect = list.stream().map(DemoObj::getAmount).sorted().collect(Collectors.toList());
//自然正向排序,用金额排序返回金额,返回DemoObj对象List<DemoObj> collect1 = list.stream().sorted(Comparator.comparingInt(DemoObj::getAmount)).collect(Collectors.toList());
2.naturalOrder、reverseOrder
<T extends Comparable<? super T>> Comparator<T> naturalOrder()
<T extends Comparable<? super T>> Comparator<T> reverseOrder()

使用示例

//自然排序。返回的比较器是可序列化的,并且在比较null时抛出NullPointerException
List<Integer> collect2 = list.stream().map(DemoObj::getAmount).sorted(Comparator.naturalOrder()).collect(Collectors.toList());
//逆向排序,跟naturalOrder相反
List<Integer> collect3 = list.stream().map(DemoObj::getAmount).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
3.nullsFirst、nullsLast
<T> Comparator<T> nullsFirst(Comparator<? super T> comparator)
<T> Comparator<T> nullsLast(Comparator<? super T> comparator)

比较器构建

Comparator<DemoObj> nullsFirstComparator = Comparator.nullsFirst(Comparator.comparing(DemoObj::getAmount));
Comparator<DemoObj> nullsLastComparator = Comparator.nullsLast(Comparator.comparing(DemoObj::getAmount));

使用示例

//允许null元素比较,null在前面,非空元素通过指定的比较器比较List<DemoObj> list = new ArrayList<>();list.add(new DemoObj("222", 22));list.add(new DemoObj("111", 11));list.add(null);Comparator<DemoObj> nullsFirstComparator = Comparator.nullsFirst(Comparator.comparing(DemoObj::getAmount));List<DemoObj> collect4 = list.stream().sorted(nullsFirstComparator).collect(Collectors.toList());//允许null元素比较,null在后面,,非空元素通过指定的比较器比较Comparator<DemoObj> nullsLastComparator = Comparator.nullsLast(Comparator.comparing(DemoObj::getAmount));List<DemoObj> collect5 = list.stream().sorted(nullsLastComparator).collect(Collectors.toList());

2.默认方法

1.compare、reversed
int compare(T o1, T o2); //比较
Comparator<T> reversed() //逆序

使用示例

Comparator<Integer> comparing2 = Integer::compare;
//比较两个数,大于等于小于分别返回 -1 0 1
int compare = comparing2.compare(2, 3);
// reversed 逆序
Comparator<DemoObj> comparing3 = Comparator.comparing(DemoObj::getAmount).reversed();
List<DemoObj> collect6 = list.stream().sorted(comparing3).collect(Collectors.toList());
2.thenComparing

设置多个排序顺序,相同数据按下一级顺序排序

Comparator<T> thenComparing(Comparator<? super T> other)
<U> Comparator<T> thenComparing( Function<? super T, ? extends U> keyExtractor,Comparator<? super U> keyComparator)
<U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor)
Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor)
Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor)
Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)

使用示例

 //当comparing4排序的数据一致时,按comparing排序规则排序Comparator<DemoObj> comparing = Comparator.comparing(DemoObj::getAmount);Comparator<DemoObj> demoObjComparator = Comparator.comparing(DemoObj::getCode).thenComparing(comparing);List<DemoObj> collect7 = list.stream().sorted(demoObjComparator).collect(Collectors.toList());
测试示例
public class Test {public static void main(String[] args)  {List<DemoObj> list = new ArrayList<>();list.add(new DemoObj("222", 22));list.add(new DemoObj("111", 22));list.add(new DemoObj("111", 11));//自然正向排序,接收一个类型的key,返回一个按该key进行比较的比较器Comparator<DemoObj> comparing = Comparator.comparing(DemoObj::getAmount);Comparator<DemoObj> comparingInt = Comparator.comparingInt(DemoObj::getAmount);Comparator<DemoObj> comparingDouble = Comparator.comparingDouble(DemoObj::getAmount);Comparator<DemoObj> comparingLong = Comparator.comparingLong(DemoObj::getAmount);//接收一个类型的key,第二个参数为自定义排序规则,返回比较器Comparator<DemoObj> comparing1 = Comparator.comparing(DemoObj::getAmount, (x, y) -> x.compareTo(y));//自然正向排序,用金额排序返回金额List<Integer> collect = list.stream().map(DemoObj::getAmount).sorted().collect(Collectors.toList());//自然正向排序,用金额排序返回金额,返回DemoObj对象List<DemoObj> collect1 = list.stream().sorted(Comparator.comparingInt(DemoObj::getAmount)).collect(Collectors.toList());//自然排序。返回的比较器是可序列化的,并且在比较null时抛出NullPointerExceptionList<Integer> collect2 = list.stream().map(DemoObj::getAmount).sorted(Comparator.naturalOrder()).collect(Collectors.toList());//逆向排序,跟naturalOrder相反List<Integer> collect3 = list.stream().map(DemoObj::getAmount).sorted(Comparator.reverseOrder()).collect(Collectors.toList());//允许null元素比较,null在前面,非空元素通过指定的比较器比较//list.add(null);Comparator<DemoObj> nullsFirstComparator = Comparator.nullsFirst(Comparator.comparing(DemoObj::getAmount));List<DemoObj> collect4 = list.stream().sorted(nullsFirstComparator).collect(Collectors.toList());//允许null元素比较,null在后面,,非空元素通过指定的比较器比较Comparator<DemoObj> nullsLastComparator = Comparator.nullsLast(Comparator.comparing(DemoObj::getAmount));List<DemoObj> collect5 = list.stream().sorted(nullsLastComparator).collect(Collectors.toList());Comparator<Integer> comparing2 = Integer::compare;//比较两个数,大于等于小于分别返回 -1 0 1int compare = comparing2.compare(2, 3);//逆序排序Comparator<DemoObj> comparing3 = Comparator.comparing(DemoObj::getAmount).reversed();List<DemoObj> collect6 = list.stream().sorted(comparing3).collect(Collectors.toList());//当comparing4排序的数据一致时,按comparing排序规则排序Comparator<DemoObj> comparing4 = Comparator.comparing(DemoObj::getCode);Comparator<DemoObj> demoObjComparator = comparing4.thenComparing(comparing);List<DemoObj> collect7 = list.stream().sorted(demoObjComparator).collect(Collectors.toList());System.out.println(collect7);}static class  DemoObj{private String code;private Integer amount;public DemoObj(String code, Integer amount) {this.code = code;this.amount = amount;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public Integer getAmount() {return amount;}public void setAmount(Integer amount) {this.amount = amount;}@Overridepublic String toString() {return "DemoObj{" +"code='" + code + '\'' +", amount=" + amount +'}';}}
}

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

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

相关文章

Docker进阶:Docker Swarm(集群搭建) —实现容器编排的利器

Docker进阶&#xff1a;Docker Swarm&#xff08;集群搭建&#xff09; —实现容器编排的利器 1、什么是Docker Swarm&#xff1f;2、Docker Swarm 与 Docker Compose的区别3、创建一个Swarm集群&#xff08;1-Manager&#xff0c;2-Worker&#xff09;1、资源准备2、初始化Swa…

【JavaEE初阶系列】——带你了解volatile关键字以及wait()和notify()两方法背后的原理

目录 &#x1f6a9;volatile关键字 &#x1f388;volatile 不保证原子性 &#x1f388;synchronized 也能保证内存可见性 &#x1f388;Volatile与Synchronized比较 &#x1f6a9;wait和notify &#x1f388;wait()方法 &#x1f4bb;wait(参数)方法 &#x1f388;noti…

8.HelloWorld小案例

文章目录 一、Java程序开发运行流程如何理解编译&#xff1f; 二、HelloWorld案例的编写1、新建文本文档文件&#xff0c;修改名称为HelloWorld.java。2、用记事本打开HelloWorld.java文件&#xff0c;输写程序内容。代码要跟我编写的完全保持一致。3、ctrl s 保存&#xff0c…

JavaScript基础练习题之计算数组元素的和与平均值

一、如何使用JavaScript计算数组元素的和与平均值&#xff1f; 二、正确的源程序 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>计算数组元素的和与平均值</title></head><body><h1>计算数组元…

AIGC重塑金融 | 大模型在金融行业的应用场景和落地路径

作者&#xff1a;林建明 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版 目录 01 大模型在金融领域的 5 个典型应用场景 02 大模型在金融领域应用所面临的风险及其防范 03 AIGC 技术的科…

蓝桥杯 - 小明的背包3(多重背包)

解题思路&#xff1a; 动态规划 多重背包问题需要在01背包问题&#xff08;不重复&#xff09;的基础上多加一层循环进行遍历&#xff0c;并且dp[ j ]的式子也需要修改 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan …

CSS及javascript

一、CSS简介 css是一门语言&#xff0c;用于控制网页的表现。 cascading style sheet:层叠样式表 二、css的导入方式 css代码与html代码的结合方式 &#xff08;1&#xff09;css导入html有三种方式&#xff1a; 1.内联样式&#xff1a;<div style"color:red&quo…

element-ui autocomplete 组件源码分享

紧接着 input 组件的源码&#xff0c;分享带输入建议的 autocomplete 组件&#xff0c;在 element-ui 官方文档上&#xff0c;没有这个组件的 api 目录&#xff0c;它的 api 是和 input 组件的 api 在一起的&#xff0c;看完源码之后发现&#xff0c;源码当中 autocomplete 组件…

MySQL中的基本SQL语句

文章目录 MySQL中的基本SQL语句查看操作创建与删除数据库和表修改表格数据库用户管理 MySQL中的基本SQL语句 查看操作 1. 查看有哪些数据库 show databases; 2.切换数据库 use 数据库名;比如切换至 mysql数据库 use mysql;3.查看数据库中的表 show tables;4.查看表中…

新能源汽车驱动电机振动噪音分析

驱动电机示例图 驱动电机的噪声主要分为空气动力噪声、电磁噪声和机械噪声。其中在高速运转时空气动力噪声是主要噪声&#xff0c;中低速运转时电磁噪声为主要噪声。 1、空气动力噪声&#xff1a; 空气噪声主要由于风扇转动&#xff0c;使空气流动、撞击、摩擦而产生&#x…

ARM-按键中断实验

代码 #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGICC->IAR&0x3ff;switch (irqno){case 99:pr…

2023年后端面试总结

备注&#xff1a;这篇文章是我在2023年年初在自己的网站上写的&#xff0c;最近在迁移技术文章&#xff0c;我感觉这个也是和咱程序员相关&#xff0c;所以今天就决定把它迁移过来。 .......................................................................分割线..........…

AJAX-综合

文章目录 同步代码和异步代码回调函数地狱解决回调函数地狱Promise-链式调用async函数和awaitasync函数和await-捕获错误 事件循环宏任务与微任务Promise.all静态方法 同步代码和异步代码 同步代码&#xff1a;逐步执行&#xff0c;需原地等待结果后&#xff0c;才继续向下执行…

后端常问面经之计算机网络

一台机器理论上能创建多少条TCP连接&#xff1f; Linux每维护一条TCP连接都要花费内存资源的&#xff0c;每一条静止状态&#xff08;不发送数据和不接收数据&#xff09;的 TCP 连接大约需要吃 3.44K 的内存&#xff0c;那么 8 GB 物理内存的服务器&#xff0c;最大能支持的 …

微服务day07 -- 搜索引擎 ( 数据聚合 + 自动补全 + 数据同步 + ES集群 )

1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f; 这些手机的平均价格、最高价格、最低价格&#xff1f; 这些手机每月的销售情况如何&#xff1f; 实现这些…

R语言基础入门

1.保存或加载工作空间 改变工作目录——进行文件读写&#xff0c;默认去指定文件进行操作。&#xff08;使用R时&#xff0c;最好先设定工作目录&#xff08;setwd(),getwd()&#xff09;&#xff09; setwd(“工作文件路径”)&#xff1a;建立工作目录 getwd&#xff08;&…

OpenGL 实现“人像背景虚化“效果

手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…

C语言与sqlite3入门

c语言与sqlite3入门 1 sqlite3数据类型2 sqlite3指令3 sqlite3的sql语法3.1 创建表create3.2 删除表drop3.3 插入数据insert into3.4 查询select from3.5 where子句3.6 修改数据update3.7 删除数据delete3.8 排序Order By3.9 分组GROUP BY3.10 约束 4 c语言执行sqlite34.1 下载…

计算机毕业设计Hadoop+Spark+Hive租房推荐系统 贝壳租房数据分析 租房爬虫 租房可视化 租房大数据 大数据毕业设计 大数据毕设 机器学习

毕业技术方向调查表 姓名&#xff1a; 李昌福 课题方向 房无忧房屋租赁平台 开发语言&#xff1a; Java 前端框架&#xff1a; VUE 数据库&#xff1a; MySQL 服务器端 框架&#xff1a; SpringCloud 其他技术&#xff1a; Hadoop、HDFS 方向…

HTML网站的概念

目录 前言&#xff1a; 1.什么是网页&#xff1a; 2.什么是网站&#xff1a; 示例&#xff1a; 3.服务器&#xff1a; 总结&#xff1a; 前言&#xff1a; HTML也称Hyper Text Markup Language&#xff0c;意思是超文本标记语言&#xff0c;同时HTML也是前端的基础&…