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

关于Java8中的Comparator那些事的更多相关文章

  1. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 //Before Java 8: new Thread(new Runnable() { @Overri ...

  2. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  3. Java7 和 Java8 中的 ConcurrentHashMap 原理解析

    Java7 中 ConcurrentHashMap ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些. 整个 ConcurrentHash ...

  4. java8中Lambda表达式和Stream API

    一.Lambda表达式 1.语法格式 Lambda是匿名函数,可以传递代码.使用“->”操作符,改操作符将lambda分成两部分: 左侧:指定了 Lambda 表达式需要的所有参数 右侧:指定了 ...

  5. Java8函数之旅 (二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  6. 【转】java8中谨慎使用实数作为HashMap的key!

    java8中谨慎使用实数作为HashMap的key! java8中一个hashCode()函数引发的血案java8中一个hashCode()函数引发的血案1.起因2.实数的hashCode()3.总结 ...

  7. 一文带你认识Java8中接口的默认方法

    Java8是Oracle于2014年3月发布的一个重要版本,其API在现存的接口上引入了非常多的新方法. 例如,Java8的List接口新增了sort方法.在Java8之前,则每个实现了List接口的 ...

  8. Java8中的流操作-基本使用&性能测试

    为获得更好的阅读体验,请访问原文:传送门 一.流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).这有点儿 ...

  9. 公子奇带你一步一步了解Java8中Lambda表达式

    在上一篇<公子奇带你一步一步了解Java8中行为参数化>中,我们演示到最后将匿名实现简写为 (Police police) -> "浙江".equals(poli ...

随机推荐

  1. 一个工程中cpp文件的编译顺序

    做了一个实验. 最后build失败,失败的原因是变量i被重定义了.原本按照我的思路,是不应该失败的.因为我用了条件编译,若先编译Source.cpp,则会#define __HEADER_H__并且定 ...

  2. JMeter之If Controller深究一

    1.背景 大家最近还好么,截止目前新型冠状病毒累计确诊病例已超7万4千多例,希望大家无论是在家办公还是单位办公,一定要注意自我防护.今天跟大家分享一下,最近一次真实生产压测遇到的问题,如题:if co ...

  3. Python Namespace - 命名空间

    命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python ...

  4. 阿里云服务器ECS Ubuntu18.04 建立新用户

    昨天花了好长时间终于把界面功能弄好了,今天找时间再折腾一下: 1.建立新的用户: ssh连接上,用以下命令建立新用户,并设置密码: 创建普通用户“myname”成功,接下来为用户“myname”赋予s ...

  5. pytorch-- Attention Mechanism

    1. paper: Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translat ...

  6. 数据算法 --hadoop/spark数据处理技巧 --(5.移动平均 6. 数据挖掘之购物篮分析MBA)

    五.移动平均 多个连续周期的时间序列数据平均值(按相同时间间隔得到的观察值,如每小时一次或每天一次)称为移动平均.之所以称之为移动,是因为随着新的时间序列数据的到来,要不断重新计算这个平均值,由于会删 ...

  7. kubernetes(14):k8s基于NFS部署storageclass实现pv自动供给

    k8s基于NFS部署storageclass实现pv自动供给 https://www.cnblogs.com/Smbands/p/11059843.html https://www.jianshu.c ...

  8. bat常用符合和for语句等

    一.开头 @echo off(默认是echo on)@echo off执行以后,后面所有的命令均不显示,包括本条命令 二.特殊符号 1. | 命令管道符,echo Y|rd /s c:\abc,通过管 ...

  9. python之基础中的基础(二)

    1.字典 创建字典,alien_0={'color':'green','points':5}其中由一个又一个的“键-值”对组成. 访问键-值对相应的值,print(alien_0['color']), ...

  10. C语言三 语句练习

    输入一个整数day代表星期几,根据day的值输出对应的星期几,比如day==1,就输出“星期一”(用两种方式实现) int Day; printf("请输入一个1~7的数字"); ...