在前面一篇Java可比和比较器对比详解中,对于Java中的排序方法进行比较和具体剖析,主要是针对比较器接口和可比的接口,无论是哪种方式,都需要实现这个接口,并且重写里面的方法。
Java8中对其进行了优化,直接调用比较器类即可实现一些自定义的排序功能,比如按照某个字段升序,并且按照某个字段降序排列,还有如果出现零的情况怎么处理等等。下面是针对常见的基础数据类型的列表和对象的集合进行排序的演示。
/* * *关于java8中的比较器排序方法 */公开课CompareController2 { 公共静态void main (String [] args) {/* * *对常见的列表等进行升序和降序 */List列表=arrays . aslist (10133、34546、53345);//自然顺序,升序 list.sort (Comparator.naturalOrder ()); System.out.println(列表);//降序 list.sort (Comparator.reverseOrder ()); System.out.println(列表);/* * *对于对象的排序 */List ,studentsList=new ArrayList<的在(); studentsList。添加新学生(“zhangSan”, 28岁的“北京”)); studentsList。添加新学生(“liSi”, 25日,“上海”)); studentsList。添加(新学生(“wangWu”, 22)); studentsList.sort (Comparator.comparing(学生::getName)); system . out。println(“按照姓名升序:“+ studentsList); studentsList.sort (Comparator.comparing(学生::getAge) .reversed ()); system . out。println(“按照年龄降序:“+ studentsList); studentsList.sort (Comparator.comparing(学生::getAddress Comparator.nullsLast(字符串:compareTo)) .reversed ()); system . out。println(“按照地址降序,若有,空放到最前面:“+ studentsList); studentsList.sort (Comparator.comparing(学生::getAddress Comparator.nullsFirst(字符串:compareTo)) .reversed ()); system . out。println(“按照地址降序,若有,空放到最后面:“+ studentsList); studentsList.sort (Comparator.comparing(学生::getAddress Comparator.nullsLast(字符串:compareTo)) .reversed () .thenComparing(学生::getAge)); system . out。println(“按照地址降序,若有,空放到最前面,然后再按照年龄升序:“+ studentsList); } }
<强>比较器的源码解析强>
最近的学习,让我意识到了看源码的重要性,所以分析完比较器如何使用后,继续研究源码。
1)首先看下比较的源码,其实就是compareTo方法。
2)接下看下thenComparing方法,其实就是比较方法,和我们实现某个接口并且重写里面的方法类似,只不过比较器在底层帮我们实现了。
3)最后来看下比较有趣的nullsFirst方法和nullsLast方法,两个方法其实主要就是nullFirst的标志位不同,其底层仍然是实现比较方法,只不过加了一个对于零的判断,还有一个是根据nullFirst的标志位的判断. get ! ! !
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。