设为首页 收藏本站
查看: 863|回复: 0

[经验分享] Apache-collection中BidiMap、MultiMap和LazyMap的使用

[复制链接]

尚未签到

发表于 2017-1-9 10:23:38 | 显示全部楼层 |阅读模式
Apache-collection中BidiMap、MultiMap和LazyMap的使用
1.import java.util.ArrayList;  
2.import java.util.Collection;  
3.import java.util.Date;  
4.import java.util.HashMap;  
5.import java.util.Iterator;  
6.import java.util.List;  
7.import java.util.Map;  
8.  
9.import org.apache.commons.collections.BidiMap;  
10.import org.apache.commons.collections.Factory;  
11.import org.apache.commons.collections.MultiHashMap;  
12.import org.apache.commons.collections.MultiMap;  
13.import org.apache.commons.collections.bidimap.DualHashBidiMap;  
14.import org.apache.commons.collections.map.LazyMap;  
15.import org.apache.commons.lang.StringUtils;  
16.  
17.public class MutiMap  
18.{  
19.  
20. public static void main(String[] args) {  
21.  //demoBidiMap();  
22.        //demoMultiMap();  
23.        demoLazyMap();  
24.}
/****
* 所谓BidiMap,直译就是双向Map,可以通过key找到value,
* 也可以通过value找到key,这在我们日常的代码-名称匹配的时候很方便:
* 因为我们除了需要通过代码找到名称之外,往往也需要处理用户输入的名称,然后获取其代码。
* 需要注意的是BidiMap当中不光key不能重复,value也不可以。
*/
1.   public static void demoBidiMap() {
2.       System.out.println(StringUtils.center(" demoBidiMap ", 40, "="));  
3.       BidiMap bidiMap = new DualHashBidiMap();  
4.       bidiMap.put("BJ", "Beijing");  
5.       bidiMap.put("SH", "Shanghai");  
6.       bidiMap.put("GZ", "Guangzhou");  
7.       bidiMap.put("CD", "Chengdu");  
8.       System.out.println("Key-Value: BJ = " + bidiMap.get("BJ"));  
9.       System.out.println("Value-Key: Chengdu = " + bidiMap.getKey("Chengdu"));  
10.       System.out.println(StringUtils.repeat("=", 40));
11.}
/****
* 所谓MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,
* add()和remove()的时候跟普通的Map无异,只是在get()时返回一个Collection,
* 利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多。
*/
@SuppressWarnings(value = {"unchecked"})
public static void demoMultiMap()
{
System.out.println(StringUtils.center(" demoMultiMap ", 40, "="));
List<String> list = new ArrayList<String>();
List<String> valuelist = new ArrayList<String>();
list.add("123");
list.add("456");
list.add("789");
MultiMap multiMap = new MultiHashMap();
multiMap.put("Sean", list);
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"));
Iterator itet = ((Collection) multiMap.get("Sean")).iterator();
while(itet.hasNext())
{
Object obj = itet.next();
if(obj instanceof List)
{
valuelist = (List<String>)obj;
for(Object value:valuelist)
{
System.out.println("obj1:"+value);
}
}else if(obj instanceof String)
{
System.out.println("value:"+obj.toString());
}
}
System.out.println(StringUtils.repeat("=", 40));
}
/**所谓LazyMap,意思就是这个Map中的键/值对一开始并不存在,当被调用到时才创建.
* 我们这样来理解:我们需要一个Map,但是由于创建成员的方法很“重”(比如数据库访问),
* 或者我们只有在调用get()时才知道如何创建,或者Map中出现的可能性很多很多,
* 我们无法在get()之前添加所有可能出现的键/值对,
* 我们觉得没有必要去初始化一个Map而又希望它可以在必要时自动处理数据
*
*/
@SuppressWarnings(value = {"unchecked"})
public static void demoLazyMap()
{
System.out.println(StringUtils.center(" demoLazyMap ", 40, "="));
Factory factory = new Factory() {
public Object create() {
return new Date();
}
};
Map lazy = LazyMap.decorate(new HashMap(), factory);
System.out.println("map:"+lazy);//lazy为空
System.out.println(lazy.get("123"));
System.out.println(lazy.get("345"));
System.out.println(StringUtils.repeat("=", 40));
}
}


import java.util.Map;
import java.util.Date;
import java.util.HashMap;
import org.apache.commons.collections.map.LazyMap;
import org.apache.commons.collections.FactoryUtils;
import org.apache.commons.collections.map.IdentityMap;
import org.apache.commons.collections.map.CaseInsensitiveMap;
public class MapHeavenV1 {
public static void main(String args[]) {
MapHeavenV1 instance = new MapHeavenV1();
instance.createMaps();
instance.testMaps();
}
private void testMaps() {
cIMap.put("key1", "value1");
cIMap.put("key2", "value2");
cIMap.put("KeY1", "value3");
System.err.println("Value of key1: " + cIMap.get("key1")); // value3 because it is case insensitive
Integer identRef = new Integer(1);
Integer identRef2 = new Integer(1);
identMap.put(identRef, "value1");
identMap.put(identRef2, "value3");
System.err.println("Value of identRef2: " + identMap.get(identRef2)); // value 3 even though both identRef and identRef2 are equal
System.err.println(lazyMap); // only creates elements when they are accessed
lazyMap.get("EmptyBuffer");
System.err.println(lazyMap);
}
private void createMaps() {
cIMap = new CaseInsensitiveMap();
identMap = new IdentityMap();
lazyMap = LazyMap.decorate(
new HashMap(),
FactoryUtils.instantiateFactory(StringBuffer.class));
}
private CaseInsensitiveMap cIMap;//key大小写不敏感
private IdentityMap identMap;//key数字唯一
private Map lazyMap;
}

MultiKey示例
import java.util.HashMap;
import org.apache.commons.collections.keyvalue.MultiKey;
public class MultiKeyExampleV2 {
private static HashMap codeAndLangToText;
public static void main(String args[]) {
codeAndLangToText = new HashMap();
addMultiKeyAndValue("en", "GM", "Good Morning");
addMultiKeyAndValue("en", "GE", "Good Evening");
addMultiKeyAndValue("en", "GN", "Good Night");
addMultiKeyAndValue("de", "GM", "Guten Morgen");
addMultiKeyAndValue("de", "GE", "Guten Abend");
addMultiKeyAndValue("de", "GN", "Guten Nacht");
System.err.println("Good Evening in English: " +
codeAndLangToText.get(new MultiKey("en", "GE")));
System.err.println("Good Night in German: " +
codeAndLangToText.get(new MultiKey("de", "GN")));
}
private static void addMultiKeyAndValue(
Object key1, Object key2, Object value) {
MultiKey key = new MultiKey(key1, key2);
codeAndLangToText.put(key, value);
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-325889-1-1.html 上篇帖子: [Apache Click快速开发]Click的组件(一) 下篇帖子: 安装xampp后apache不能启动解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表