Guava源码分析——Ordering

毋庸置疑,Ordering肯定实现了Comparator<T>接口,这是Java中比较排序使用的。而其中的静态方法返回一种类型的Ordering,不同的Ordering子类实现各自的compare()方法,如下所示:

public static <C extends Comparable> Ordering<C> natural() {
  return (Ordering<C>) NaturalOrdering.INSTANCE;
}

实现类有如下:

如果Ordering的子类构造时不需要参数,只是用final static INSTANCE的方法构造为单例,由于没有共享的成员变量,所以线程安全。

装饰模式在其中使用的炉火纯青。举个例子验证一下:

List<Integer> numbers = Lists.newArrayList(null, 1, 3, 2, 5, 4, 6);
List<Integer> sorted = Ordering.natural().nullsFirst().sortedCopy(numbers);
for (Integer integer : sorted) {
  System.out.println(integer);
}

Ordering.natural()返回NaturalOrdering.INSTANCE对象,然后调用nullFirst()后,会return new NullsFirstOrdering<S>(this);此时的this为NaturalOrdering.INSTANCE对象,而NullsFirstOrdering构造方法聚合Ordering父类,在重写compare()方法时,加入null排序逻辑后,进行后装饰。

@Override 
public int compare(@Nullable T left, @Nullable T right) {   if (left == right) { return 0; } if (left == null) {    return RIGHT_IS_GREATER; } if (right == null) { return LEFT_IS_GREATER; } return ordering.compare(left, right); }

最后Ordering父类中封装的方式sortedCopy(),在调用 Arrays.sort(array, this)方法,以装饰后的Ordering作为Comparator传入sort()方法,从而完美的实现chain形式的书写方式和调用规则。

其他排序方式的实现就不一一说明了。Ordering主要分析的还是装饰器的使用

 

转载于:https://www.cnblogs.com/pona/p/4531046.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值