接下來(lái)看Map組。 BidiMap MultiMap LazyMap MapUtils Commons Collections在java.util.Map的基礎(chǔ)上擴(kuò)展了很多接口和類,比較有代表性的是BidiMap、MultiMap和LazyMap。跟Bag和Buffer類似,Commons Collections也提供了一個(gè)MapUtils。 所謂BidiMap,直譯就是雙向Map,可以通過(guò)key找到value,也可以通過(guò)value找到key,這在我們?nèi)粘5拇a-名稱匹配的時(shí)候很方便:因?yàn)槲覀兂诵枰ㄟ^(guò)代碼找到名稱之外,往往也需要處理用戶輸入的名稱,然后獲取其代碼。需要注意的是BidiMap當(dāng)中不光key不能重復(fù),value也不可以。 所謂MultiMap,就是說(shuō)一個(gè)key不在是簡(jiǎn)單的指向一個(gè)對(duì)象,而是一組對(duì)象,add()和remove()的時(shí)候跟普通的Map無(wú)異,只是在get()時(shí)返回一個(gè)Collection,利用MultiMap,我們就可以很方便的往一個(gè)key上放數(shù)量不定的對(duì)象,也就實(shí)現(xiàn)了一對(duì)多。 所謂LazyMap,意思就是這個(gè)Map中的鍵/值對(duì)一開(kāi)始并不存在,當(dāng)被調(diào)用到時(shí)才創(chuàng)建,這樣的解釋初聽(tīng)上去是不是有點(diǎn)不可思議?這樣的LazyMap有用嗎?我們這樣來(lái)理解:我們需要一個(gè)Map,但是由于創(chuàng)建成員的方法很“重”(比如數(shù)據(jù)庫(kù)訪問(wèn)),或者我們只有在調(diào)用get()時(shí)才知道如何創(chuàng)建,或者Map中出現(xiàn)的可能性很多很多,我們無(wú)法在get()之前添加所有可能出現(xiàn)的鍵/值對(duì),或者任何其它解釋得通的原因,我們覺(jué)得沒(méi)有必要去初始化一個(gè)Map而又希望它可以在必要時(shí)自動(dòng)處理數(shù)據(jù)生成的話,LazyMap就變得很有用了。 我們還是通過(guò)一個(gè)具體的例子來(lái)說(shuō)明: package sean.study.commons.collections; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.collections.BidiMap; import org.apache.commons.collections.Factory; import org.apache.commons.collections.MultiHashMap; import org.apache.commons.collections.MultiMap; import org.apache.commons.collections.bidimap.DualHashBidiMap; import org.apache.commons.collections.map.LazyMap; import org.apache.commons.lang.StringUtils; public class MapUsage { public static void main(String[] args) { demoBidiMap(); demoMultiMap(); demoLazyMap(); } public static void demoBidiMap() { System.out.println(StringUtils.center(" demoBidiMap ", 40, "=")); BidiMap bidiMap = new DualHashBidiMap(); bidiMap.put("BJ", " bidiMap.put("SH", " bidiMap.put("GZ", " bidiMap.put("CD", " System.out.println("Key-Value: BJ = " + bidiMap.get("BJ")); System.out.println("Value-Key: System.out.println(StringUtils.repeat("=", 40)); } public static void demoMultiMap() { System.out.println(StringUtils.center(" demoMultiMap ", 40, "=")); MultiMap multiMap = new MultiHashMap(); multiMap.put("Sean", "C/C++"); multiMap.put("Sean", "OO"); multiMap.put("Sean", "Java"); multiMap.put("Sean", ".NET"); multiMap.remove("Sean", "C/C++"); System.out.println("Sean's skill set: " + multiMap.get("Sean")); System.out.println(StringUtils.repeat("=", 40)); } public static void demoLazyMap() { System.out.println(StringUtils.center(" demoLazyMap ", 40, "=")); // borrowed from Commons Collection's Javadoc Factory factory = new Factory() { public Object create() { return new Date(); } }; Map lazy = LazyMap.decorate(new HashMap(), factory); System.out.println(lazy.get("NOW")); System.out.println(StringUtils.repeat("=", 40)); } } 以下是運(yùn)行結(jié)果: ============= demoBidiMap ============== Key-Value: BJ = Value-Key: ======================================== ============= demoMultiMap ============= Sean's skill set: [OO, Java, .NET] ======================================== ============= demoLazyMap ============== Wed Aug 03 12:44:56 CST 2005 ======================================== |
|
來(lái)自: moonboat > 《Jakarta Commons》