[Jakarta Commons笔记] Commons Collections - Map组(转载)

[color=red]从[url]http://www.360doc.com/content/08/1112/13/18042_1909885.shtml[/url]看到的,觉得很好,所以拿来转载一下,顺便给自己个link,里面还有其他精彩的[Jakarta Commons笔记][/color]
[Jakarta Commons笔记] Commons Collections - Map组

接下来看Map组。



[color=darkblue]BidiMap

MultiMap

LazyMap

MapUtils[/color]



Commons Collections在java.util.Map的基础上扩展了很多接口和类,比较有代表性的是BidiMap、MultiMap和LazyMap。跟Bag和Buffer类似,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));

}



}



以下是运行结果:



[color=blue]============= 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

========================================[/color]



简单说一下这个Factory,它是定义在org.apache.commons.collections包下面的一个接口,用于自定义对象的创建过程。这个有点像是后面我们要讲的Transformer的简化版本,但是也更直接也很好用,至少Commons Collections通过它向开发人员开放了一个可以方便控制对象创建细节的接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值