简介
Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强。它非常容易扩展,可以轻松构造复杂的comparator,然后用在容器的比较、排序等操作中。
本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法。另外,Ordering提供了链式方法调用和加强现有的比较器。
下面我们看看Ordering中的一些具体方法和简单的使用实例。
常见的静态方法
方法 | 备注 |
---|---|
natural() | 使用Comparable类型的自然顺序, 例如:整数从小到大,字符串是按字典顺序 |
usingToString() | 使用toString()返回的字符串按字典顺序进行排序 |
arbitrary() | 返回一个所有对象的任意顺序, 即compare(a, b) == 0 就是 a == b (identity equality)。 本身的排序是没有任何含义, 但是在VM的生命周期是一个常量 |
使用
以下示例代码中使用到的People类包含name和age两个属性。
natural()
该方法使用自然排序规则生成排序器,如从小到大、日期先后顺序。使用这个方法之前先介绍一下onResultOf 方法,这个方法接收一个Function函数,该函数的返回值可以用于natural方法排序的依据,即根据这个返回值来进行自然排序,示例代码如下:
public class testNatural {
public static void main(String[] args) {
List<People> peopleList = new ArrayList<People>() {{
add(new People("A", 33));
add(new People("B", 11));
add(new People("C", 18));
}};
Ordering<People> ordering = Ordering.natural().onResultOf(new Function<People, Comparable>() {
@Override
public Comparable apply(People people) {
return people.getAge();
}
}).reverse();
for (People people : peopleList) {
System.out.println(people.getName() + " " + people.getAge());
}
for (People p : ordering.sortedCopy(peopleList)) {
System.out.println(p.getName() + " " + p.getAge());
}
for (People people : peopleList) {
System.out.println(people.getName() + " " + people.getAge());
}
}
}
sortedCopy方法会使用创建的排序器排序并生成一个新的List。对于Ordering.natural().onResultOf方法,阅读顺序是从后往前,即根据onResultOf 方法的返回值按照自然规则创建一个Ordering,然后调用sortedCopy方法排序并生成新List。输出结果如下:
People{name=B, age=11}
People{name=C, age=18}
People{name=A, age=33}
reverse()
这个方法使用反向的排序规则来排序,即若使用natural规则创建Ordering后,再接着调用reverse方法,则按照自然规则的反向,从大到小的规则排序,示例代码
usingToString()
该方法创建Ordering,并根据排序依据值的toString方法值来使用natural规则排序
from()
该方法接收一个自定义的Comparator比较器来创建Ordering,根据Comparator中的自定义规则排序
应用
BrandShopUgcExecutor brandShopUgcExecutor = new BrandShopUgcExecutor();
OrderByWeight orderByWeight = brandShopUgcExecutor.new OrderByWeight();
OrderByFollowNote orderByFollowNote = brandShopUgcExecutor.new OrderByFollowNote();
//定义笔记器
Ordering<ReviewData> ordering = Ordering.from(orderByWeight).compound(orderByFollowNote);
//排序
Collections.sort(reviewDataList, ordering);
List<Integer> reviewIdList = Lists.newArrayList();
for (ReviewData reviewData : reviewDataList) {
reviewIdList.add(reviewData.getReviewId());
}
return reviewIdList;
}
参考:
https://blog.csdn.net/windrui/article/details/51558518(Guava之Ordering)
https://www.cnblogs.com/peida/p/Guava_Ordering.html(Guava学习笔记:Ordering犀利的比较器)