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 方法。

Java8 Comparator源码演示及解析

2)接下看下 thenComparing 方法,其实就是 compare 方法,和我们实现某个接口并且重写里面的方法类似,只不过 Comparator在底层帮我们实现了。

Java8 Comparator源码演示及解析

3)最后来看下比较有趣的 nullsFirst 方法和 nullsLast 方法,两个方法其实主要就是 nullFirst的标志位不同,其底层仍然是 实现 compare方法,只不过加了一个对于null 的判断,还有一个是根据 nullFirst的标志位 的判断。Get !!!

Java8 Comparator源码演示及解析

Java8 Comparator源码演示及解析

来源: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
  • asp之家 软件编程 m.aspxhome.com