zoukankan      html  css  js  c++  java
  • java apache-commons-collections中Map辅助类的使用

    前言

    apache-commons-collections中Map辅助类,很是有用。尽管我们通过原生Map经过业务逻辑处理也能达到相同的作用与效果,但毕竟作为一个开源的工具类辅助类,对它有个了解还是有必要的。

    maven依赖

    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-collections4</artifactId>
    	<version>4.0</version>
    </dependency>
    

    LazyMap

    LazyMap,意思就是这个Map中的键/值对一开始并不存在,当被调用到时才创建,如果get(key)这个key不存在的话,会返回实例化中传入的factory里方法的返回值(具体看下边代码就一目了解了),的这样的解释初听上去是不是有点不可思议?这样的LazyMap有用吗?我们这样来理解:我们需要一个Map,但是由于创建成员的方法很“重”(比如数据库访问),或者我们只有在调用get()时才知道如何创建,或者Map中出现的可能性很多很多,我们无法在get()之前添加所有可能出现的键/值对,或者任何其它解释得通的原因,我们觉得没有必要去初始化一个Map而又希望它可以在必要时自动处理数据生成的话,LazyMap就变得很有用了。

    public static void main(String[] args) {
    	System.out.println(StringUtils.center(" LazyMap ", 40, "="));
    	// 返回无参的默认对象
    	Factory factory1 = new Factory() {
    		@Override
    		public Object create() {
    			// TODO Auto-generated method stub
    			return new Date();
    		}
    	};
    
    	// 根据Key返回指定的对象
    	Transformer factory2 = new Transformer() {
    		@Override
    		public Object transform(Object input) {
    			// TODO Auto-generated method stub
    			System.out.println("key:" + input);
    			return new Date();
    		}
    	};
    
    	Map lazy1 = LazyMap.lazyMap(new HashMap(), factory1);
    	Map lazy2 = LazyMap.lazyMap(new HashMap(), factory2);
    	System.out.println("map-lazy1 :" + lazy1);// lazy为空
    	System.out.println("map-lazy2 :" + lazy2);
    	System.out.println(lazy1.get("123"));
    	System.out.println(lazy2.get("123"));
    	System.out.println(StringUtils.repeat("=", 40));
    
    }
    

    =============== LazyMap ================
    map-lazy1 :{}
    map-lazy2 :{}
    Mon Aug 26 11:32:05 CST 2019
    key:123
    Mon Aug 26 11:32:05 CST 2019
    ========================================

    BidiMap

    BidiMap,“bidi”是单词bidirectional 的简写,意思是双向的,故而可以大概想到这个Map的“特长”是通过key找到value,又可通过value找到key(当然我们用JDK中的Map调用entrySet等遍历也可以做到,只不过这个是写好封装好了的,更简便易用些),故而BidiMap当中key和value都不能重复了。

    public static void main(String[] args) {
    	System.out.println(StringUtils.center(" BidiMap ", 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"));
    
    	bidiMap.remove("BJ");
    	bidiMap.removeValue("Chengdu");
    	System.out.println("Size: = " + bidiMap.size());
    	System.out.println("Key-Value: BJ = " + bidiMap.get("BJ"));
    	System.out.println("Value-Key: Chengdu = " + bidiMap.getKey("Chengdu"));
    
    	System.out.println(StringUtils.repeat("=", 40));
    
    }
    

    =============== BidiMap ================
    Key-Value: BJ = Beijing
    Value-Key: Chengdu = CD
    Size: = 2
    Key-Value: BJ = null
    Value-Key: Chengdu = null
    ========================================

    MultiMap

    MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,这个一组对象不是我们想象的普通用法value一次存入一个包含多个对象的集合或者数组,而是它可以对一个key,进行多次add,多次add的value都会存入这一个key对应的对象中(其实底层是个ArrayList实现这个存储的即数组实现),remove()的时候跟普通的Map无异,只是在get()时返回一个Collection(ArrayList实例),利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多,很方便的。

    public static void main(String[] args) {
    
    	System.out.println(StringUtils.center(" MultiMap ", 40, "="));
    
    	MultiMap multiMap = new MultiValueMap();
    
    	String key = "zhangsan";
    	multiMap.put(key, "男");
    	multiMap.put(key, "30");
    	multiMap.put(key, "Java");
    	multiMap.put(key, "工程师");
    
    	// 移除Key中的某个值
    	boolean result = multiMap.removeMapping(key, "Java");
    	System.out.println(result);
    
    	System.out.println(multiMap.size());
    
    	System.out.println("Sean's skill set: " + multiMap.get(key));
    	Iterator itet = ((Collection) multiMap.get(key)).iterator();
    	while (itet.hasNext()) {
    		Object obj = itet.next();
    		if (obj instanceof List) {
    			List<String> 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));
    }
    
    

    =============== MultiMap ===============
    true
    1
    Sean’s skill set: [男, 30, 工程师]
    value:男
    value:30
    value:工程师
    ========================================

  • 相关阅读:
    C#DataGridView的简单使用
    Python实现简单登陆验证(文件操作)
    【hive】centos7下apache-hive-3.1.2-bin的安装测试
    【mysql】centos7下mysql的安装以及基本操作
    【hadoop】细读MapReduce的工作原理
    【hadoop】看懂WordCount例子
    【hadoop】在eclipse上运行WordCount的操作过程
    纪念一下,时隔多年,继delphi上成功运行sql之后
    【Linux下Hadoop-eclipse-plus-3.2.0】编译Hadoop连接eclipse的插件遇见的一系列错误,崩溃的操作
    数据挖掘初次接触!学习代码
  • 原文地址:https://www.cnblogs.com/gmhappy/p/11863937.html
Copyright © 2011-2022 走看看