Java8 Comparator源码演示及解析

所属分类: 软件编程 / java 阅读数: 53
收藏 0 赞 0 分享

在前面一篇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 方法。

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

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

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

更多精彩内容其他人还在看

Springmvc restful配置遇到的小坑

本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
收藏 0 赞 0 分享

Java中的匿名内部类小结

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。这篇文章主要介绍了Java中的匿名内部类的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java的云打印Lodop

这篇文章主要介绍了Java的云打印Lodop 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java线程池框架核心代码解析

这篇文章主要针对Java线程池框架核心代码进行详细解析,分析Java线程池框架的实现ThreadPoolExecutor,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java 交换两个变量的数值实现方法

下面小编就为大家带来一篇Java 交换两个变量的数值实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

全面了解JAVA_BaseDAO数据处理类

下面小编就为大家带来一篇全面了解JAVA_BaseDAO数据处理类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java、python、JavaScript以及jquery循环语句的区别

本篇文章主要介绍java、python、JavaScript以及jquery的循环语句的区别,这里整理了它们循环语句语法跟示例,以便大家阅读,更好的区分它们的不同
收藏 0 赞 0 分享

基于JDBC封装的BaseDao(实例代码)

下面小编就为大家带来一篇基于JDBC封装的BaseDao(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

简单通用JDBC辅助类封装(实例)

下面小编就为大家带来一篇简单通用JDBC辅助类封装(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈java线程中生产者与消费者的问题

下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多