Java集合排序规则接口Comparator用法解析
1.前言
最近用到了集合排序(基于Java8)。现在我能用Stream的就用Stream,真香!排序可以这么写:
List
peoples=newArrayList<>();
//中间省略
//按照年龄从小到大排序
peoples.sort(Comparator.comparing(People::getAge));
这里排序用到了一个关键接口java.util.Comparator。排序比较作为业务中经常出现的需求,我们有必要研究一下这个接口。
2.Comparator概念
Comparator是一个函数式接口。它经常用于没有天然排序的集合进行排序,如Collections.sort或Arrays.sort或者对于某些有序数据结构的排序规则进行声明,如TreeSet、TreeMap。也就是该接口主要用来进行集合排序。
3.Comparator中的方法
Comparator作为一个函数式接口只有一个抽象方法,但是它有很多的默认方法,我们来认识一下这些方法们。
3.1compare抽象方法
作为Comparator唯一的抽象方法,intcompare(To1,To2)比较两个参数的大小,返回负整数,零,正整数,分别代表o1<o2、o1=o2、o1>o2,通常分别返回-1、0或1。伪表达式:
//输入两个同类型的对象,输出一个比较结果的int数字
(x1,x2)->int
实现该方法一定要注意以下事项:
- 必须保证compare(x,y)和compare(y,x)的值的和必须为0。
- 必须保证比较的顺序关系是可传递的,如果compare(x,y)>0而且compare(y,z)>0则compare(x,z)>0。
- 如果存在compare(x,y)=0,则对于z而言,存在compare(x,z)==compare(y,z)。
然而并不严格要求(compare(x,y)==0)==(x.equals(y))。一般说来,任何违背这个条件的Comparator实现都应该明确指出这一事实情况。
3.2comparing系列方法
从Java8开始,Comparator提供了一系列的静态方法,并通过函数式的风格赋予Comparator更加强大和方便的功能,我们暂且称它们为comparing系列方法。
publicstaticComparator comparing( FunctionkeyExtractor, ComparatorkeyComparator) { Objects.requireNonNull(keyExtractor); Objects.requireNonNull(keyComparator); return(Comparator &Serializable) (c1,c2)->keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2)); }
该方法是该系列方法的基本方法。是不是看上去很难懂的样子?我们来分析一下该方法。它一共两个参数都是函数式接口。
第一个参数Function<?superT,?extendsU>keyExtractor表示输入一个是T类型对象,输出一个U类型的对象,举个例子,输入一个People对象返回其年龄Integer数值:
//people->people.getAge();转换为下面方法引用
FunctiongetAge=People::getAge;
第二个参数keyComparator就很好理解了,表示使用的比较规则。
对c1,c2按照第一个参数keyExtractor提供的规则进行提取特征,然后第二个参数keyComparator对这两个特征进行比较。下面的式子其实可以概括为3.1的(x1,x2)->int
(c1,c2)->keyComparator.compare(keyExtractor.apply(c1),
keyExtractor.apply(c2))
Comparator&Serializable为Java8新特性:同时满足这两个类型约束
理解了这个方法后,其它该系列的方法就好理解了,这里不再赘述。目前comparing系列方法使用更加广泛。我们举一些例子:
List
peoples=newArrayList<>();
//………………
//按照年龄从低到高排序
peoples.sort(Comparator.comparing(People::getAge));
//按照年龄从高到低排序
peoples.sort(Comparator.comparing(People::getAge,(x,y)->-x.compareTo(y)));
同样你可以使用java.util.Collections或者Stream提供的排序方法来使用Comparator。
4.小结
今天对Comparator进行了简单的分析,它用于构建集合排序的规则,在日常开发中非常有用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。