Guava链式风格Ordering比较器实例

1.简介

Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法。另外,Ordering提供了链式方法调用和加强现有的比较器,可以轻松构造复杂的comparator。

2.实例

场景是对一个list中的元素按照一定规则排序,首先我们新建一个TestOrder类:

import com.sun.istack.internal.Nullable;
import lombok.Data;

@Data
public class TestOrder {

  @Nullable
  private Integer id;
  private String msg;

  public TestOrder(Integer id,String msg){
    this.id = id;
    this.msg = msg;
  }

}

我们要按照TestOrder中的ID进行排序,一般情况下有两种方式,一种就是循环 list并按照规则将TestOrder插入新的list;另一种方式是实现Comparable接口。我们使用Guava只需要如下代码:

@Test
  public void test(){
    TestOrder testOrder1 = new TestOrder(1,"test1");
    TestOrder testOrder2 = new TestOrder(2,"test2");
    TestOrder testOrder3 = new TestOrder(3,"test3");
    TestOrder testOrderNull = new TestOrder(null,"null");
    List listResource = Lists.newArrayList(testOrderNull,testOrder1,testOrder3,testOrder2);
    System.out.println(listResource.toString());
    /*****************************
    *guava Ordering编写比较器
    *****************************/
    Ordering ordering = Ordering.natural().nullsLast().onResultOf(new Function() {
      public Integer apply(TestOrder testOrder) {
        return testOrder.getId();
      }
    });
    /*****************************
    *guava Ordering比较器结束
    *****************************/
    System.out.println(ordering.sortedCopy(listResource));
  }

控制台输出为:
[TestOrder(id=null, msg=null), TestOrder(id=1, msg=test1), TestOrder(id=3, msg=test3), TestOrder(id=2, msg=test2)]
[TestOrder(id=1, msg=test1), TestOrder(id=2, msg=test2), TestOrder(id=3, msg=test3), TestOrder(id=null, msg=null)]
其中比较器部分就是我们的比较规则,然后调用ordering的sortedCopy方法就会返回一个按照比较器排序的list了。
那么为什么叫链式风格呢?比如我们写的这个比较器,要从最后的调用往前读,也就是:
1.执行apply方法得到ID

  1. nullsLast把为ID为null的放到最后
    3.按照ID的自然规则排,ID是数字也就是从小到大,时间等类型同理
    所以如果是一个很复杂的比较器的话,链式风格就很易读了,清晰明了

3.参考

创建排序器:常见的排序器可以由下面的静态方法创建

| 方法 | 描述 |
| natural() | 对可排序类型做自然排序,如数字按大小,日期按先后排序 |
| usingToString() | 按对象的字符串形式做字典排序[lexicographical ordering] |
| from(Comparator) | 把给定的Comparator转化为排序器 |

操作方法:

reverse(): 返回与当前Ordering相反的排序:
  nullsFirst(): 返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
  nullsLast():返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
  compound(Comparator):返回一个使用Comparator的Ordering,Comparator作为第二排序元素,例如对bug列表进行排序,先根据bug的级别,再根据优先级进行排序;
  lexicographical():返回一个按照字典元素迭代的Ordering;
  onResultOf(Function):将function应用在各个元素上之后, 在使用原始ordering进行排序;
  greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。
  leastOf(Iterable iterable,int k):返回指定的第k个可迭代的最小的元素,按照这个从最小到最大的顺序。是不稳定的。
  isOrdered(Iterable):是否有序,Iterable不能少于2个元素。
  isStrictlyOrdered(Iterable):是否严格有序。请注意,Iterable不能少于两个元素。
  sortedCopy(Iterable):返回指定的元素作为一个列表的排序副本。

你可能感兴趣的:(Guava链式风格Ordering比较器实例)