1. 程式人生 > 實用技巧 >Guava基本工具--排序: Guava強大的”流暢風格比較器”

Guava基本工具--排序: Guava強大的”流暢風格比較器”

排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建複雜的比較器,以完成集合排序的功能。

從實現上說,Ordering例項就是一個特殊的Comparator例項。Ordering把很多基於Comparator的靜態方法(如Collections.max)包裝為自己的例項方法(非靜態方法),並且提供了鏈式呼叫方法,來定製和增強現有的比較器。

建立排序器:常見的排序器可以由下面的靜態方法建立

方法描述
natural() 對可排序型別做自然排序,如數字按大小,日期按先後排序
usingToString() 按物件的字串形式做字典排序[lexicographical ordering]
from(Comparator) 把給定的Comparator轉化為排序器

實現自定義的排序器時,除了用上面的from方法,也可以跳過實現Comparator,而直接繼承Ordering:

   Ordering<String> byLengthOrdering = new Ordering<String>() { 

   public int compare(String left, String right) { 

   return Ints.compare(left.length(), right.length()); 

   } 

   };

鏈式呼叫方法:通過鏈式呼叫,可以由給定的排序器衍生出其它排序器

方法描述
reverse() 獲取語義相反的排序器
nullsFirst() 使用當前排序器,但額外把null值排到最前面。
nullsLast() 使用當前排序器,但額外把null值排到最後面。
compound(Comparator) 合成另一個比較器,以處理當前排序器中的相等情況。
lexicographical() 基於處理型別T的排序器,返回該型別的可迭代物件Iterable<T>的排序器。
onResultOf(Function) 對集合中元素呼叫Function,再按返回值用當前排序器排序。

例如,你需要下面這個類的排序器。

   class Foo { 

   

考慮到排序器應該能處理sortedBy為null的情況,我們可以使用下面的鏈式呼叫來合成排序器:

   Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() { 

   public String apply(Foo foo) { 

   return foo.sortedBy; 

   } 

   }); 

當閱讀鏈式呼叫產生的排序器時,應該從後往前讀。上面的例子中,排序器首先呼叫apply方法獲取sortedBy值,並把sortedBy為null的元素都放到最前面,然後把剩下的元素按sortedBy進行自然排序。之所以要從後往前讀,是因為每次鏈式呼叫都是用後面的方法包裝了前面的排序器。

注:用compound方法包裝排序器時,就不應遵循從後往前讀的原則。為了避免理解上的混亂,請不要把compound寫在一長串鏈式呼叫的中間,你可以另起一行,在鏈中最先或最後呼叫compound。

超過一定長度的鏈式呼叫,也可能會帶來閱讀和理解上的難度。我們建議按下面的程式碼這樣,在一個鏈中最多使用三個方法。此外,你也可以把Function分離成中間物件,讓鏈式呼叫更簡潔緊湊。

Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(sortKeyFunction)

運用排序器:Guava的排序器實現有若干操縱集合或元素值的方法

方法描述另請參見
greatestOf(Iterable iterable, int k) 獲取可迭代物件中最大的k個元素。 leastOf
isOrdered(Iterable) 判斷可迭代物件是否已按排序器排序:允許有排序值相等的元素。 isStrictlyOrdered
sortedCopy(Iterable) 判斷可迭代物件是否已嚴格按排序器排序:不允許排序值相等的元素。 immutableSortedCopy
min(E, E) 返回兩個引數中最小的那個。如果相等,則返回第一個引數。 max(E, E)
min(E, E, E, E...) 返回多個引數中最小的那個。如果有超過一個引數都最小,則返回第一個最小的引數。 max(E, E, E, E...)
min(Iterable) 返回迭代器中最小的元素。如果可迭代物件中沒有元素,則丟擲NoSuchElementException。 max(Iterable), min(Iterator), max(Iterator)



作者:小雞在路上
連結:https://www.jianshu.com/p/1c49cfa72f94
來源:簡書