Guava中Ordering

guava中Ordering类是对Compartor接口的实现,但它也只是一个抽象类.

当调用Ordering.natural()方法时,它就会返回一个NaturalOrdering的对象,NaturalOrdering是对Ordering的继承.它其中的compare实现了相应的比较两个对象的方法.natural的比较方法是从小到大,对于字符串是字典序排序.与之类似的调用ordering.reverse(),ordering.nullsFirst方法会返回ReverseOrdering和NullsFirstOrdering对象.它们其中也都有compare方法.

Ordering可以实现链式调用定义自己的排序器,当我们使用这样的语句时Ordering.natural().nullsFirst().reverse(),则会返回一个Ordering对象.它能够实现对List的从大到小,null在最后的比较操作.

底层实现:

首先Ordering.natural()会返回一个NaturalOrdering对象,然后调用该对象的nullsFirst()方法,该方法会调用NullsFirstOrdering(this)构造函数,返回一个NullsFirstOrdering对象.在该构造函数中,首先会将this放入它的私有属性中,然后在NullsFirstOrdering的compare方法中,它会判断两个比较的对象是否为空,若为空,则返回1或-1,否则就调用传入的NaturalOrdering对象的返回值.reverse()方法也是类似的,它会先将传入的NullsFirstOrdering对象放入私有属性中存储下来,然后在compare(a,b)方法中实现传入对象的compare(b,a),从而达到翻转的效果.从而可以看出,Ordering中的链式调用,实际上对上一个Ordering的层层封装.

原文地址:https://www.cnblogs.com/userrain/p/5317617.html