common-collection學(xué)習(xí)筆記

在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實例


bag 使用示例



實體 Bean


學(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 使用示例

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就變得很有用了。



bidiMap 使用示例


MultiMap 使用示例

map迭代

jdk中的map接口很難進行迭代。api用戶總是需要通過entryset或者keyset進行迭代。commons-collectons現(xiàn)在提供了一個新的接口—mapiterator來允許對maps進行簡單的迭代。


IterableMap 使用示例

?BeanMap(已過時)

將bean 和map間進行轉(zhuǎn)換


BeanMap ?API



BeanMap 使用示例


學(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方法:


collections.copy() API

官方注釋:復(fù)制所有的元素從一個表到另一個。操作之后,目標列表中每個復(fù)制元素的索引將與源列表中的索引相同。目標列表必須至少與源列表一樣長。如果時間較長,目標列表中的其余元素不受影響。


樣例1


樣例2


額外分享2:依次移除 list 中的元素。



初始化 list
普通 for 循環(huán)移除和 地迭代器移除


迭代器移除


加強 for 循環(huán)移除


結(jié)果:

解決方案:



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,340評論 11 349
  • 1、面向?qū)ο蟮奶卣饔心男┓矫?1.抽象:抽象就是忽略一個主題中與當前目標無關(guān)的那些方面,以便更充分地注意與當前目標...
    michaelgong閱讀 842評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,739評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 2,019評論 0 3