在前面一篇博文中,对于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 !!!

最新文章

  1. python笔记1-转义字符
  2. Sqoop:Could not load db driver class: com.microsoft.sqlserver.jdbc.SQLServerDriver
  3. jquery.get()
  4. handlebars,each循环里面套each循环
  5. import package的问题
  6. mac 配置Python集成开发环境(Eclipse +Python+Pydev)
  7. 非常有用!eclipse与myeclipse恢复已删除的文件和代码
  8. 拦截QT关闭窗口的CloseEvent
  9. wpa_cli 连接 wifi
  10. C++ 隐式类类型转换和转换操作符
  11. 通过onActivityResult()先跳转到联系人界面,然后把传回来的手机号显示到应用的EditText上
  12. JQuery其他常用函数
  13. bboss oreach循环嵌套遍历map
  14. django源码分析 python manage.py runserver
  15. Windows服务器端口绑定证书
  16. nginx实现限速
  17. git命令及远程仓库操作内容整理
  18. 06-03 Java 面向对象思想概述、开发设计特征,类和对象的定义使用,对象内存图
  19. [转]Magento2命令行配置之性能测试生成数据
  20. java单例模式实例

热门文章

  1. 仅仅知道如何终止XHR请求,或许对你来说是不够的!
  2. qt creator源码全方面分析(2-0)
  3. tomcat增加内存 JVM内存调优
  4. asp.net MVC项目开发之统计图echarts后台数据的处理(三)
  5. OpenCV4系列之图像梯度和边缘检测
  6. Python3标准库:functools管理函数的工具
  7. Hash存储模型、B-Tree存储模型、LSM存储模型介绍
  8. luogu2173 [ZJOI2012]网络
  9. 【python数据挖掘】批量爬取站长之家的图片
  10. MySql概述及入门(五)