JAVA comparator
Posted hdw1115
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA comparator相关的知识,希望对你有一定的参考价值。
在实际开发中,我们经常会遇到需要排序的情况。在正常是用java Sort时需要提供一个comparator,但是有时因为有空指针所以会报错,所以这时我们就需要是用comparator提供的nullLast和nullFirst方法。
Comparator
我们先介绍一下comparator,我们后文称为比较器。比较器实际上是一个实现了comparator interface是一个实例,在Arrays.sort方法我们可以提供这样一个实例,即使被排序的object没有实现comparable接口,我们也可以排序了。构建comparator实例的方法有很多,这里介绍我个人比较喜欢的通过Comparator提供的静态方法来创建实例的方法。我们使用一个类Person举例,Pesron有着3个成员变量,firstName, middleName, lastName,都是String类型。如果我们想要对一个Pesron[] array通过firstName的字符顺序排序,我们可以写成 Arrays.sort(arrays, Comparator.comparing(Person::getFirstName)), 在这里,comparing方法就会返回一个comparator的实例。这里的comparing方法需要一个参数,叫做键提取器,他将类型T映射为一个可以比较的类型(在这里,是String),然后每次比较时就通过映射过来的键来排序。再打个比方,如果我们想通过firstName的长度排序,我们就可以写成Arrays.sort(arrays, Comparator.comparing(x -> x.getFirstName().length())),其中x->x.getFirstName() 等价于 Person::getFirstName, 一个是lambda表达式,一个是方法引用。
不过其实,在上面的俩个例子中都存在着问题,我们都没有考虑到数组中存在null的情况,一旦数组中存在null,这个方法就会报错。所以这时就需要nullLast和nullFirst方法。
nullLast, nullFirst
nullLast需要传递一个comparator实例,每次comparator在比较时,会把null放在排序的最后而不会报错(实际上就是null和其他任何值比较都会返回-1),然后nullLast会返回一个comparator实例。所以上面的代码写成Arrays.sort(arrays, nullsLast(Comparator.comparing(aw -> aw.getFirstName())))就可以了
以上是关于JAVA comparator的主要内容,如果未能解决你的问题,请参考以下文章
Java 集合学习笔记:比较器 ComparableComparator
Java 集合学习笔记:比较器 ComparableComparator