[Jakarta Commons笔记] Commons Collections
接下来看Map组。<o:p></o:p><o:p> </o:p>
BidiMap<o:p></o:p>
MultiMap<o:p></o:p>
LazyMap<o:p></o:p>
MapUtils<o:p></o:p>
<o:p> </o:p>
Commons Collections在java.util.Map的基础上扩展了很多接口和类,比较有代表性的是BidiMap、MultiMap和LazyMap。跟Bag和Buffer类似,Commons Collections也提供了一个MapUtils。<o:p></o:p>
<o:p> </o:p>
所谓BidiMap,直译就是双向Map,可以通过key找到value,也可以通过value找到key,这在我们日常的代码-名称匹配的时候很方便:因为我们除了需要通过代码找到名称之外,往往也需要处理用户输入的名称,然后获取其代码。需要注意的是BidiMap当中不光key不能重复,value也不可以。<o:p></o:p>
<o:p> </o:p>
所谓MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,add()和remove()的时候跟普通的Map无异,只是在get()时返回一个Collection,利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多。<o:p></o:p>
<o:p> </o:p>
所谓LazyMap,意思就是这个Map中的键/值对一开始并不存在,当被调用到时才创建,这样的解释初听上去是不是有点不可思议?这样的LazyMap有用吗?我们这样来理解:我们需要一个Map,但是由于创建成员的方法很“重”(比如数据库访问),或者我们只有在调用get()时才知道如何创建,或者Map中出现的可能性很多很多,我们无法在get()之前添加所有可能出现的键/值对,或者任何其它解释得通的原因,我们觉得没有必要去初始化一个Map而又希望它可以在必要时自动处理数据生成的话,LazyMap就变得很有用了。<o:p></o:p>
<o:p> </o:p>
我们还是通过一个具体的例子来说明:<o:p></o:p>
<o:p> </o:p>
package sean.study.commons.collections;<o:p></o:p>
<o:p> </o:p>
import java.util.Date;<o:p></o:p>
import java.util.HashMap;<o:p></o:p>
import java.util.Map;<o:p></o:p>
<o:p> </o:p>
import org.apache.commons.collections.BidiMap;<o:p></o:p>
import org.apache.commons.collections.Factory;<o:p></o:p>
import org.apache.commons.collections.MultiHashMap;<o:p></o:p>
import org.apache.commons.collections.MultiMap;<o:p></o:p>
import org.apache.commons.collections.bidimap.DualHashBidiMap;<o:p></o:p>
import org.apache.commons.collections.map.LazyMap;<o:p></o:p>
import org.apache.commons.lang.StringUtils;<o:p></o:p>
<o:p> </o:p>
public class MapUsage {<o:p></o:p>
<o:p> </o:p>
public static void main(String[] args) {<o:p></o:p>
demoBidiMap();<o:p></o:p>
demoMultiMap();<o:p></o:p>
demoLazyMap();<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public static void demoBidiMap() {<o:p></o:p>
System.out.println(StringUtils.center(" demoBidiMap ", 40, "="));<o:p></o:p>
BidiMap bidiMap = new DualHashBidiMap();<o:p></o:p>
bidiMap.put("BJ", "<st1:city w:st="on"><st1:place w:st="on">Beijing</st1:place></st1:city>");<o:p></o:p>
bidiMap.put("SH", "<st1:city w:st="on"><st1:place w:st="on">Shanghai</st1:place></st1:city>");<o:p></o:p>
bidiMap.put("GZ", "<st1:city w:st="on"><st1:place w:st="on">Guangzhou</st1:place></st1:city>");<o:p></o:p>
bidiMap.put("CD", "<st1:city w:st="on"><st1:place w:st="on">Chengdu</st1:place></st1:city>");<o:p></o:p>
System.out.println("Key-Value: BJ = " + bidiMap.get("BJ"));<o:p></o:p>
System.out.println("Value-Key: <st1:city w:st="on">Chengdu</st1:city> = " + bidiMap.getKey("<st1:city w:st="on"><st1:place w:st="on">Chengdu</st1:place></st1:city>"));<o:p></o:p>
System.out.println(StringUtils.repeat("=", 40));<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public static void demoMultiMap() {<o:p></o:p>
System.out.println(StringUtils.center(" demoMultiMap ", 40, "="));<o:p></o:p>
MultiMap multiMap = new MultiHashMap();<o:p></o:p>
multiMap.put("Sean", "C/C++");<o:p></o:p>
multiMap.put("Sean", "OO");<o:p></o:p>
multiMap.put("Sean", "Java");<o:p></o:p>
multiMap.put("Sean", ".NET");<o:p></o:p>
multiMap.remove("Sean", "C/C++");<o:p></o:p>
System.out.println("Sean's skill set: " + multiMap.get("Sean"));<o:p></o:p>
System.out.println(StringUtils.repeat("=", 40));<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public static void demoLazyMap() {<o:p></o:p>
System.out.println(StringUtils.center(" demoLazyMap ", 40, "="));<o:p></o:p>
// borrowed from Commons Collection's Javadoc<o:p></o:p>
Factory factory = new Factory() {<o:p></o:p>
public Object create() {<o:p></o:p>
return new Date();<o:p></o:p>
}<o:p></o:p>
};<o:p></o:p>
Map lazy = LazyMap.decorate(new HashMap(), factory);<o:p></o:p>
System.out.println(lazy.get("NOW"));<o:p></o:p>
System.out.println(StringUtils.repeat("=", 40));<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
}<o:p></o:p>
<o:p> </o:p>
以下是运行结果:<o:p></o:p>
<o:p> </o:p>
============= demoBidiMap ==============<o:p></o:p>
Key-Value: BJ = <st1:city w:st="on"><st1:place w:st="on">Beijing</st1:place></st1:city><o:p></o:p>
Value-Key: <st1:city w:st="on"><st1:place w:st="on">Chengdu</st1:place></st1:city> = CD<o:p></o:p>
========================================<o:p></o:p>
============= demoMultiMap =============<o:p></o:p>
Sean's skill set: <o:p></o:p>
========================================<o:p></o:p>
============= demoLazyMap ==============<o:p></o:p>
Wed Aug 03 12:44:56 CST 2005<o:p></o:p>
========================================<o:p></o:p>
<o:p> </o:p>
简单说一下这个Factory,它是定义在org.apache.commons.collections包下面的一个接口,用于自定义对象的创建过程。这个有点像是后面我们要讲的Transformer的简化版本,但是也更直接也很好用,至少Commons Collections通过它向开发人员开放了一个可以方便控制对象创建细节的接口。<o:p></o:p>
页:
[1]