Guava鏈式風格Ordering比較器例項

cyril發表於2017-12-14

###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<TestOrder> listResource = Lists.newArrayList(testOrderNull,testOrder1,testOrder3,testOrder2);
    System.out.println(listResource.toString());
    /*****************************
    *guava Ordering編寫比較器
    *****************************/
    Ordering<TestOrder> ordering = Ordering.natural().nullsLast().onResultOf(new Function<TestOrder, Integer>() {
      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 2. 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):返回指定的元素作為一個列表的排序副本。

相關文章