Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          導(dǎo)航

          公告


          • 關(guān)于我
          • 人生是一場對話
          • gaoyuxiang AT gmail DOT com
          • titlelogo.png

          • 我的譯作
          • Scala for the Impatient
          • Open Source SOA
          • Programming in Scala

          • 聲明
          • 所有文章和代碼在這里以"現(xiàn)狀"提供,作者不提供任何形式的擔(dān)保,也沒有授予除閱讀和有條件共享之外的任何權(quán)利。除非特別說明,所有文章均為本blog作者原創(chuàng),如需轉(zhuǎn)載請注明出處和原作者,如用于商業(yè)目的,需作者本人書面許可。

          • 推薦文章
          • Pylons起步

          常用鏈接

          留言簿(29)

          隨筆分類(842)

          隨筆檔案(507)

          文章檔案(4)

          Friends' blogs

          搜索

          •  

          積分與排名

          • 積分 - 781439
          • 排名 - 55

          最新評論

          閱讀排行榜

          評論排行榜

          [Jakarta Commons筆記] Commons Collections - Map組

          Posted on 2005-08-05 12:23 laogao 閱讀(4062) 評論(0)  編輯  收藏 所屬分類: On Java

           

          接下來看Map組。

           

          BidiMap

          MultiMap

          LazyMap

          MapUtils

           

          Commons Collectionsjava.util.Map的基礎(chǔ)上擴(kuò)展了很多接口和類,比較有代表性的是BidiMapMultiMapLazyMap。跟BagBuffer類似,Commons Collections也提供了一個(gè)MapUtils

           

          所謂BidiMap,直譯就是雙向Map,可以通過key找到value,也可以通過value找到key,這在我們?nèi)粘5拇a-名稱匹配的時(shí)候很方便:因?yàn)槲覀兂诵枰ㄟ^代碼找到名稱之外,往往也需要處理用戶輸入的名稱,然后獲取其代碼。需要注意的是BidiMap當(dāng)中不光key不能重復(fù),value也不可以。

           

          所謂MultiMap,就是說一個(gè)key不在是簡單的指向一個(gè)對象,而是一組對象,add()remove()的時(shí)候跟普通的Map無異,只是在get()時(shí)返回一個(gè)Collection,利用MultiMap,我們就可以很方便的往一個(gè)key上放數(shù)量不定的對象,也就實(shí)現(xiàn)了一對多。

           

          所謂LazyMap,意思就是這個(gè)Map中的鍵/值對一開始并不存在,當(dāng)被調(diào)用到時(shí)才創(chuàng)建,這樣的解釋初聽上去是不是有點(diǎn)不可思議?這樣的LazyMap有用嗎?我們這樣來理解:我們需要一個(gè)Map,但是由于創(chuàng)建成員的方法很“重”(比如數(shù)據(jù)庫訪問),或者我們只有在調(diào)用get()時(shí)才知道如何創(chuàng)建,或者Map中出現(xiàn)的可能性很多很多,我們無法在get()之前添加所有可能出現(xiàn)的鍵/值對,或者任何其它解釋得通的原因,我們覺得沒有必要去初始化一個(gè)Map而又希望它可以在必要時(shí)自動處理數(shù)據(jù)生成的話,LazyMap就變得很有用了。

           

          我們還是通過一個(gè)具體的例子來說明:

           

          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", "Beijing");

                  bidiMap.put("SH", "Shanghai");

                  bidiMap.put("GZ", "Guangzhou");

                  bidiMap.put("CD", "Chengdu");

                  System.out.println("Key-Value: BJ = " + bidiMap.get("BJ"));

                  System.out.println("Value-Key: Chengdu = " + bidiMap.getKey("Chengdu"));

                  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 = Beijing

          Value-Key: Chengdu = CD

          ========================================

          ============= demoMultiMap =============

          Sean's skill set: [OO, Java, .NET]

          ========================================

          ============= demoLazyMap ==============

          Wed Aug 03 12:44:56 CST 2005

          ========================================

           

          簡單說一下這個(gè)Factory,它是定義在org.apache.commons.collections包下面的一個(gè)接口,用于自定義對象的創(chuàng)建過程。這個(gè)有點(diǎn)像是后面我們要講的Transformer的簡化版本,但是也更直接也很好用,至少Commons Collections通過它向開發(fā)人員開放了一個(gè)可以方便控制對象創(chuàng)建細(xì)節(jié)的接口。

           

           

          主站蜘蛛池模板: 南平市| 绵阳市| 科技| 德昌县| 洛阳市| 朝阳县| 色达县| 长乐市| 聂荣县| 海宁市| 江川县| 黄大仙区| 兖州市| 麻城市| 汨罗市| 昭平县| 古蔺县| 咸丰县| 郯城县| 栖霞市| 丽水市| 运城市| 银川市| 阿勒泰市| 同仁县| 中山市| 睢宁县| 兴海县| 册亨县| 宜兴市| 新巴尔虎右旗| 乃东县| 东莞市| 河津市| 盐源县| 和静县| 凤凰县| 疏勒县| 昔阳县| 闸北区| 佛冈县|