Java8 Comparator源码演示及解析
作者:Demrystv 时间:2023-09-18 10:51:12
在前面一篇Java Comparable和Comparator对比详解中,对于java中的排序方法进行比较和具体剖析,主要是针对 Comparator接口和 Comparable接口,无论是哪种方式,都需要实现这个接口,并且重写里面的 方法。
Java8中对其进行了优化,直接调用Comparator类即可实现一些自定义的排序功能,比如按照某个字段升序,并且按照某个字段降序排列;还有如果出现null 的情况怎么处理等等。下面是针对常见的 基础数据类型的list 和 对象的集合 进行排序的演示。
/**
* 关于 java8 中的 Comparator 排序方法
*/
public class CompareController2 {
public static void main(String[] args) {
/**
* 对常见的list等进行升序和降序
*/
List<Integer> list = Arrays.asList(10,133,34,546,53,345);
// 自然顺序,升序
list.sort(Comparator.naturalOrder());
System.out.println(list);
// 降序
list.sort(Comparator.reverseOrder());
System.out.println(list);
/**
* 对于 对象的排序
*/
List<Students> studentsList = new ArrayList<>();
studentsList.add(new Students("zhangSan", 28, "beiJing"));
studentsList.add(new Students("liSi", 25, "shangHai"));
studentsList.add(new Students("wangWu", 22));
studentsList.sort(Comparator.comparing(Students::getName));
System.out.println("按照姓名升序:" + studentsList);
studentsList.sort(Comparator.comparing(Students::getAge).reversed());
System.out.println("按照年龄降序:" + studentsList);
studentsList.sort(Comparator.comparing(Students::getAddress, Comparator.nullsLast(String::compareTo)).reversed());
System.out.println("按照地址降序,若有空,放到最前面:" + studentsList);
studentsList.sort(Comparator.comparing(Students::getAddress, Comparator.nullsFirst(String::compareTo)).reversed());
System.out.println("按照地址降序,若有空,放到最后面:" + studentsList);
studentsList.sort(Comparator.comparing(Students::getAddress, Comparator.nullsLast(String::compareTo)).reversed().thenComparing(Students::getAge));
System.out.println("按照地址降序,若有空,放到最前面,然后再按照年龄升序:" + studentsList);
}
}
Comparator的源码解析
最近的学习,让我意识到了看源码的重要性,所以分析完Comparator如何使用后,继续研究源码。
1)首先看下 comparing 的源码,其实就是 compareTo 方法。
2)接下看下 thenComparing 方法,其实就是 compare 方法,和我们实现某个接口并且重写里面的方法类似,只不过 Comparator在底层帮我们实现了。
3)最后来看下比较有趣的 nullsFirst 方法和 nullsLast 方法,两个方法其实主要就是 nullFirst的标志位不同,其底层仍然是 实现 compare方法,只不过加了一个对于null 的判断,还有一个是根据 nullFirst的标志位 的判断。Get !!!
来源:https://www.cnblogs.com/Demrystv/p/11564269.html
标签:java,8,comparator,源码,解析
0
投稿
猜你喜欢
Java注解@Transactional事务类内调用不生效问题及解决办法
2022-04-03 18:42:06
Spring4如何自定义@Value功能详解
2021-12-16 06:31:12
Android如何从实现到封装一个MVP详解
2023-02-12 10:44:40
Android 通知的基本用法示例代码
2022-09-28 03:54:50
IDEA离线安装maven helper插件的图文教程
2023-11-28 16:00:24
实例详解SpringBoot默认的JSON解析方案
2023-07-21 07:34:20
Android仿今日头条APP实现下拉导航选择菜单效果
2023-09-15 07:21:05
Android控件之ListView用法实例详解
2023-09-11 00:39:26
分享Java多线程实现的四种方式
2022-02-23 06:34:21
Tornadofx学习笔记之IconTextFx开源库整合5000+个字体图标
2023-06-07 12:18:04
Android实现计步传感器功能
2021-09-29 21:54:41
RocketMQ源码解析topic创建机制详解
2023-03-16 01:06:23
android仿微信聊天界面 语音录制功能
2022-09-21 17:55:08
RocketMQ producer容错机制源码解析
2022-05-14 13:39:41
深入分析JAVA 建造者模式
2023-03-14 01:32:27
Spring MVC注解式开发使用详解
2021-07-08 23:27:50
Java流程控制语句之If选择结构
2023-11-11 04:02:29
Android中AlertDialog 点击按钮后不关闭对话框的功能
2023-08-04 22:55:50
Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)
2023-02-27 09:48:51
Java中对于双属性枚举的使用案例
2023-07-20 15:00:09