关于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 !!!

     

分享图片

 

     

分享图片

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...