java8源码_Java8 Comparator源码演示及解析

在前面一篇Java Comparable和Comparator对比详解中,对于java中的排序方法进行比较和具体剖析,主要是针对 Comparator接口和 Comparable接口,无论是哪种方式,都需要实现这个接口,并且重写里面的 方法。

Java8中对其进行了优化,直接调用Comparator类即可实现一些自定义的排序功能,比如按照某个字段升序,并且按照某个字段降序排列;还有如果出现null 的情况怎么处理等等。下面是针对常见的 基础数据类型的list 和 对象的集合 进行排序的演示。

/**

* 关于 java8 中的 Comparator 排序方法

*/

public class CompareController2 {

public static void main(String[] args) {

/**

* 对常见的list等进行升序和降序

*/

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

e89da364e10600dbedb7235f854a6205.png

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

62e7a9952dfc9e4880215be1c8cbd3f8.png

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

6f7074bee937faf9a62a932348daaa22.png

624d82da8a109d1637b4258b75aa0aa5.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值