[Google Guava] 1-4 排序: 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 { @Nullable String sortedBy; int notSortedBy; }
考慮到排序器應該能處理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) |
原創文章,轉載請註明: 轉載自並發編程網 – ifeve.com本文鏈接地址: [Google Guava] 排序: Guava強大的”流暢風格比較器”
[Google Guava] 1-4 排序: Guava強大的”流暢風格比較器”