zoukankan      html  css  js  c++  java
  • 关于Java8中的Comparator那些事

      在前面一篇博文中,对于java中的排序方法进行比较和具体剖析,主要是针对 Comparator接口和 Comparable接口,无论是哪种方式,都需要实现这个接口,并且重写里面的 方法。Java8中对其进行了优化,直接调用Comparator类即可实现一些自定义的排序功能,比如按照某个字段升序,并且按照某个字段降序排列;还有如果出现null 的情况怎么处理等等。下面是针对常见的 基础数据类型的list 和 对象的集合 进行排序的演示。

     1 /**
     2  * 关于 java8 中的 Comparator 排序方法
     3  */
     4 public class CompareController2 {
     5 
     6     public static void main(String[] args) {
     7 
     8         /**
     9          * 对常见的list等进行升序和降序
    10          */
    11         List<Integer> list = Arrays.asList(10,133,34,546,53,345);
    12         // 自然顺序,升序
    13         list.sort(Comparator.naturalOrder());
    14         System.out.println(list);
    15         // 降序
    16         list.sort(Comparator.reverseOrder());
    17         System.out.println(list);
    18 
    19         /**
    20          * 对于 对象的排序
    21          */
    22         List<Students> studentsList = new ArrayList<>();
    23         studentsList.add(new Students("zhangSan", 28, "beiJing"));
    24         studentsList.add(new Students("liSi", 25, "shangHai"));
    25         studentsList.add(new Students("wangWu", 22));
    26 
    27         studentsList.sort(Comparator.comparing(Students::getName));
    28         System.out.println("按照姓名升序:" + studentsList);
    29 
    30         studentsList.sort(Comparator.comparing(Students::getAge).reversed());
    31         System.out.println("按照年龄降序:" + studentsList);
    32 
    33         studentsList.sort(Comparator.comparing(Students::getAddress, Comparator.nullsLast(String::compareTo)).reversed());
    34         System.out.println("按照地址降序,若有空,放到最前面:" + studentsList);
    35 
    36         studentsList.sort(Comparator.comparing(Students::getAddress, Comparator.nullsFirst(String::compareTo)).reversed());
    37         System.out.println("按照地址降序,若有空,放到最后面:" + studentsList);
    38 
    39         studentsList.sort(Comparator.comparing(Students::getAddress, Comparator.nullsLast(String::compareTo)).reversed().thenComparing(Students::getAge));
    40         System.out.println("按照地址降序,若有空,放到最前面,然后再按照年龄升序:" + studentsList);
    41 
    42     }
    43 }

    Comparator的源码解析

    最近的学习,让我意识到了看源码的重要性,所以分析完Comparator如何使用后,继续研究源码。

      1)首先看下 comparing 的源码,其实就是 compareTo 方法。

           

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

           

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

         

         

  • 相关阅读:
    告别ThinkPHP6的异常页面, 让我们来拥抱whoops吧
    ThinkPHP6 上传图片代码demo
    【ThinkPHP6:从TP3升级到放弃】1. 前言及准备工作
    PHP数字金额转换大写金额
    提高PHP开发效率, PhpStorm必装的几款插件
    5分钟弄懂Docker!
    GitHub 上排名前 100 的 IOS 开源库简介
    GitHub 上排名前 100 的 Android 开源库简介
    android线程消息传递机制——Looper,Handler,Message
    Android Activity:四种启动模式,Intent Flags和任务栈
  • 原文地址:https://www.cnblogs.com/Demrystv/p/11564269.html
Copyright © 2011-2022 走看看