Guava排序器Ordering比较器,它可以用来为构建复杂的比较器,以完成集合排序的功能。从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。
长话短说,我们来看看Ordering的用法:
Ordering 为我们提供了很多静态方法:
- Ordering.natural(),自然排序,没有人会陌生,具体使用代码如下:
Ordering order=Ordering.natural();
Set set=new TreeSet(order);
set.add(34);
set.add(24);
set.add(45);
set.add(56);
set.add(78);
System.out.println(set);
运行结果:[24, 34, 45, 56, 78]
当然也可以对字符串进行自然排序。
Ordering order=Ordering.natural();
Set set=new TreeSet(order);
set.add("a");
set.add("bb");
set.add("bc");
set.add("c");
set.add("ab");
System.out.println(set);
运行结果:[a, ab, bb, bc, c]
- Ordering.usingToString(),此方法会将对象转化为字符串进行字典排序。
Ordering
Ordering.from(Comparator): 将Comparator类型的比较器,转化为Ordering比较器。
当然还有我们比较熟悉的java的一种写法:
Ordering order=new Ordering() {
@Override
public int compare(String left, String right) {
return Ints.compare(right.length(), left.length());
}
};
Ordering强大之处是在与他是支持链式风格的。Ordering为我们提供了很多方法,而这些方法都是满足链式调用的。如:reverse()(获得语义相反的比较器),nullsFirst()(使用当前排序器,但额外把null值排到最前面。),nullsLast()(使用当前排序器,但额外把null值放到最后面),onResultOf(Function)(对元素调用Function,再按返回值用当前排序器排序。),等等,这里就不在一一举例了。
//实体类
class Teacher{
String name;
int age;
public Teacher(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}
}
测试方法:
public static void Test05()
{
Ordering order=Ordering.natural().nullsLast().onResultOf(new Function() {
@Override
public Integer apply(Teacher input) {
return input.age;
}
});
Set set=new TreeSet(order);
for(int i=0;i<5;i++)
{
set.add(new Teacher("a"+i, 5-i));
}
set.add(new Teacher("a123123"+5,100));
set.add(new Teacher(null, 0));
System.out.println(set);
}
运行结果:
[Teacher [name=null, age=0], Teacher [name=a4, age=1], Teacher [name=a3, age=2], Teacher [name=a2, age=3], Teacher [name=a1, age=4], Teacher [name=a0, age=5], Teacher [name=a1231235, age=100]]
注:链式调用的时候,我们应该从右往左开,右边的每一个方法都是为前一个方法提供Ordering对象。
- Ordering 也为我们提供了一下简单的方法如:max(),min(),等等;
Ordering order=Ordering.natural();
System.out.println(order.max("a", "c","d"));
System.out.println(order.min("s", "z"));
运行结果:
d
s
这里只是比较器的一些初级使用,如果想了解更多Guava比较器的知识,可以看看Ordering的源代码。