在Java的Collections API中,不狹義的區(qū)分語法上的接口和類,把它們都看作是類的話,大致我們可以發(fā)現(xiàn)三種主要的類別:
1- 容器類:如Collection、List、Map等,用于存放對象和進行簡單操作的;
2- 操作類:如Collections、Arrays等,用于對容器類的實例進行相對復(fù)雜操作如排序等;
3- 輔助類:如Iterator、Comparator等,用于輔助操作類以及外部調(diào)用代碼實現(xiàn)對容器類的操作,所謂輔助,概括而通俗的來講,就是這些類提供一種算法,你給它一個對象或者一組對象,或者僅僅是按一定的規(guī)則調(diào)用它,它給你一個運算后的答案,幫助你正確處理容器對象。比如Iterator會告訴你容器中下一個對象有沒有、是什么,而Comparator將對象大小/先后次序的算法邏輯獨立出來。
對于這樣的一個大包,當然不可能一個類一個類的講了,找一些常用的和有用的當做學(xué)習(xí)的階段(不分輕重)。大概列個清單:
Bag
HashBag
BagUtils
--------------------------
Buffer
BlockingBuffer
BoundedFifoBuffer
PriorityBuffer
BufferUtils
--------------------------
MultiMap
BidiMap
CaseInsensitiveMap
LazyMap
MapUtils
--------------------------
TypedCollection
CollectionUtils
--------------------------
ReverseComparator
ComparatorChain
NullComparator
FixedOrderComparator
ComparatorUtils
--------------------------
Predicate
AndPredicate
OrPredicate
AllPredicate
OnePredicate
NonePredicate
PredicateUtils
--------------------------
Transformer
ChainedTransformer
SwitchTransformer
TransformerUtils
--------------------------
Closure
ChainedClosure
IfClosure
WhileClosure
ClosureUtils
--------------------------
LoopingIterator
ArrayListIterator
FilterIterator
UniqueFilterIterator
IteratorUtils
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
學(xué)習(xí)之第一組:
Bag
HashBag
BagUtils
Bag是在org.apache.commons.collections包中定義的接口,它extends java.util.Collection,而它的實現(xiàn)類都被放在下面的bag包中。之所以有這樣一組類型,是因為我們有時候需要在Collection中存放多個相同對象的拷貝,并且需要很方便的取得該對象拷貝的個數(shù)。需要注意的一點是它雖然extends Collection,但是如果真把它完全當作java.util.Collection來用會遇到語義上的問題,詳細信息參考Javadoc。
HashBag是Bag接口的一個標準實現(xiàn)。而BagUtils提供一組static的方法讓調(diào)用者獲取經(jīng)過不同裝飾后的Bag實例
學(xué)習(xí)之第二組:
Buffer
BlockingBuffer
BoundedFifoBuffer
PriorityBuffer
UnboundedFifoBuffer
BufferUtils
Buffer是定義在org.apache.commons.collections包下面的接口,用于表示按一定順序除去成員對象的collection如隊列等。具體的實現(xiàn)類在org.apache.commons.collections.buffer包下可以找到。
BufferUtils提供很多靜態(tài)/工具方法裝飾現(xiàn)有的Buffer實例,如將其裝飾成BlockingBuffer、執(zhí)行類型檢查的TypedBuffer、或者不可改變的UnmodifiableBuffer等等。
最簡單直接的Buffer實現(xiàn)類是UnboundedFifoBuffer,提供先進先出的大小可變的隊列。
而BoundedFifoBuffer則是對其大小進行了限制,是固定大小的先進先出隊列。
BlockingBuffer要在多線程的環(huán)境中才能體現(xiàn)出它的價值,尤其是當我們需要實現(xiàn)某種流水線時這個BlockingBuffer很有用:每個流水線上的組件從上游的BlockingBuffer獲取數(shù)據(jù),處理后放到下一個BlockingBuffer中依次傳遞。BlockingBuffer的核心特色通俗點說就是如果你向它要東西,而它暫時還沒有的話,你可以一直等待直至拿到為止。
PriorityBuffer則提供比一般的先進先出Buffer更強的控制力:我們可以自定義Comparator給它,告訴它怎么判定它的成員的先后順序,優(yōu)先級最高的最先走。、
Buffer的add和remove方法分別添加新成員和刪除最先加入的成員。
由于我們的Buffer定義為只能裝3個Book類的實例,所以不論我們試圖加入其他類型的對象,或者加入超過3個,操作都將失敗。
如果我們在遍歷時使用get()而不調(diào)用remove(),那么我們將得到3個相同的拷貝,而這正是我們期望的FIFO隊列的行為。
假如你需要遍歷并保留數(shù)據(jù),可以使用標準的Iterator機制。
下面我們驗證下上述的第二條:
學(xué)習(xí)之第三組:
BidiMap
MultiMap
LazyMap
MapUtils
所謂BidiMap,直譯就是雙向Map,可以通過key找到value,也可以通過value找到key,這在我們?nèi)粘5拇a-名稱匹配的時候很方便:因為我們除了需要通過代碼找到名稱之外,往往也需要處理用戶輸入的名稱,然后獲取其代碼。需要注意的是BidiMap當中不光key不能重復(fù),value也不可以。
所謂MultiMap,就是說一個key不在是簡單的指向一個對象,而是一組對象,add()和remove()的時候跟普通的Map無異,只是在get()時返回一個Collection,利用MultiMap,我們就可以很方便的往一個key上放數(shù)量不定的對象,也就實現(xiàn)了一對多。
所謂LazyMap,意思就是這個Map中的鍵/值對一開始并不存在,當被調(diào)用到時才創(chuàng)建,這樣的解釋初聽上去是不是有點不可思議?這樣的LazyMap有用嗎?我們這樣來理解:我們需要一個Map,但是由于創(chuàng)建成員的方法很“重”(比如數(shù)據(jù)庫訪問),或者我們只有在調(diào)用get()時才知道如何創(chuàng)建,或者Map中出現(xiàn)的可能性很多很多,我們無法在get()之前添加所有可能出現(xiàn)的鍵/值對,或者任何其它解釋得通的原因,我們覺得沒有必要去初始化一個Map而又希望它可以在必要時自動處理數(shù)據(jù)生成的話,LazyMap就變得很有用了。
map迭代
jdk中的map接口很難進行迭代。api用戶總是需要通過entryset或者keyset進行迭代。commons-collectons現(xiàn)在提供了一個新的接口—mapiterator來允許對maps進行簡單的迭代。
?BeanMap(已過時)
將bean 和map間進行轉(zhuǎn)換
學(xué)習(xí)之第四組:
TypedCollection
?CollectionUtils
// 并集
Collection?unionList?=?CollectionUtils.union(aList,?bList);
//?交集
Collection?intersectionList?=?CollectionUtils.intersection(aList,?bList);
//?是否存在交集
booleanisContained?=?CollectionUtils.containsAny(aList,?bList);
//?交集的補集
Collection?disjunctionList?=?CollectionUtils.disjunction(aList,?bList);
//?集合相減
Collection?subtractList?=?CollectionUtils.subtract(aList,?bList);
//?排序
Collections.sort((List)?unionList);
// 查詢
Collections.select(Collection inputCollection, Predicate predicate) //返回符合條件的 集合
官方解釋:將與給定謂詞匹配的輸入集合中的所有元素選擇為輸出集合。
(額外分享1:jdk中的collections下的copy方法:
官方注釋:復(fù)制所有的元素從一個表到另一個。操作之后,目標列表中每個復(fù)制元素的索引將與源列表中的索引相同。目標列表必須至少與源列表一樣長。如果時間較長,目標列表中的其余元素不受影響。
額外分享2:依次移除 list 中的元素。
結(jié)果:
解決方案:
)