糊言亂語

          志未半斤, 才無八兩. 有苦有樂, 糊涂過活。
          posts - 25, comments - 7, trackbacks - 0, articles - 42
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          接下來看Map組。

           

          BidiMap

          MultiMap

          LazyMap

          MapUtils

           

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

           

          所謂BidiMap,直譯就是雙向Map,可以通過key找到value,也可以通過value找到key,這在我們日常的代碼-名稱匹配的時候很方便:因為我們除了需要通過代碼找到名稱之外,往往也需要處理用戶輸入的名稱,然后獲取其代碼。需要注意的是BidiMap當中不光key不能重復,value也不可以。

           

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

           

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

           

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

           

          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));

              }

           

          }

           

          以下是運行結果:

           

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

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

           

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

          評論

          # re: [Jakarta Commons筆記] Commons Collections - Map組  回復  更多評論   

          2013-08-09 17:01 by onewarden
          MultiMap multiMap = new MultiHashMap();
          沒有MultiHashMap這個類吧,應該是MultiValueMap
          主站蜘蛛池模板: 靖安县| 阳信县| 大关县| 宁国市| 吉木乃县| 鄄城县| 两当县| 花垣县| 隆德县| 左权县| 新绛县| 阜城县| 清水县| 子长县| 永川市| 天等县| 济宁市| 铜鼓县| 铁力市| 湟源县| 汕头市| 克什克腾旗| 明溪县| 澄城县| 松溪县| 甘谷县| 蕲春县| 湾仔区| 闽清县| 元阳县| 当涂县| 墨江| 衡东县| 大关县| 阿合奇县| 湄潭县| 酉阳| 蕉岭县| 上林县| 普兰县| 罗城|