前言

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:工程师

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

java apache-commons-collections中Map辅助类的使用的更多相关文章

  1. 出现java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap错误问题解决

    首先出现这个问题,你应该是用了 BeanUtils.populate(meter,map); import org.apache.commons.beanutils.BeanUtils;并且导入了co ...

  2. 关于java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap的错误解决办法

    在JavaEE开发中,在把配置文件中的数据或用户表单提交上来的数据,封装在相应JavaBean的对象的对应属性中时:在实际开发中,使用第三方法工具包BeanUtils(commons-beanutil ...

  3. java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap报错解决

    在使用 commons-beanutils-1.9.2.jarcommons-logging-1.1.1.jar 的时候报错 java.lang.NoClassDefFoundError: org/a ...

  4. java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap

    七月 26, 2017 1:52:15 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for ...

  5. Apache Commons Collections 反序列化详细分析学习总结

    0x01.环境准备: Apache Commons Collections 3.1版本,下载链接参考: https://www.secfree.com/a/231.html jd jui地址(将jar ...

  6. ysoserial分析【一】 之 Apache Commons Collections

    目录 前言 基础知识 Transformer 利用InvokerTransformer造成命令执行 Map TransformedMap LazyMap AnnotationInvocationHan ...

  7. java apache commons HttpClient发送get和post请求的学习整理(转)

    文章转自:http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx HttpClient 是我最近想研究的东西,以前想过的一些应用 ...

  8. java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap 解决方法

    转自:https://blog.csdn.net/q664243624/article/details/69221324

  9. java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap-----commons-ctions版本问题

    今天用到了一系列的第三方jar包,一环扣一环, 记住一个: 倘若你所导入的第三方jar包中的类一直显示未找到,那就是你的路径出问题了, /WEB-INF/lib目录下才是放第三方jar包位置, 但是今 ...

随机推荐

  1. python正则表达式解析(re)

    正则表达式的使用方法主要有4种: re.search(进行正则匹配), re.match(从头开始匹配)  re.findall(找出所有符合条件的字符列表)  re.split(根据条件进行切分)  ...

  2. java html table 转 excel,给予jdom 和 poi

    maven 引入 <dependency> <groupId>org.jdom</groupId> <artifactId>jdom</artif ...

  3. iOS去除数组中重复的model数据

    // 去除数组中model重复 ; i < self.selectedModelArray.count; i++) { ;j < self.selectedModelArray.count ...

  4. DataTable.Select筛选过滤数据返回DataRow[]转为DataTable添加到DataSet

    问题还原,如图所示,我们要筛选所有SHDP 为北京翠微KR的数据. 1. 筛选DataTable微软为我们提供了一个方法DataTable.Select(),其用法如下: 1)  Select()—— ...

  5. DOM事件练习 I

    目录 input框动态显示事件 红绿灯模拟 顶部广告栏关闭 鼠标悬停IMG上时,更换另一张图片 悬浮框自动出现 模态框案例 input框动态显示事件 <head> <meta cha ...

  6. 通过URLOS安装Redis缓存为wordpress网站提速

    快!快!快!我们都知道网站的加载速度直接影响用户体验.据研究发现,网站页面在3秒内加载完毕对用户而言是最佳的浏览体验.如果超过这个时间,用户跳出网站的几率会非常大.所以对于站长来说,提高速度是他们追求 ...

  7. C学习笔记-枚举

    枚举定义 可以使用枚举(enumerated type)声明代表整数常量的符号名称,关键字enum创建一个新的枚举类型 实际上,enum常量是int类型的 枚举的本质就是int型的常量 enum sp ...

  8. 第五次java实验报告

    Java实验报告 班级 计科二班 学号 20188437 姓名 何磊 完成时间2019/10/10 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实 ...

  9. [转帖]Linux性能测试 pmap命令

    Linux性能测试 pmap命令 https://www.cnblogs.com/txw1958/archive/2012/07/26/linux-pmap.html 名称:       pmap - ...

  10. Spark中分布式使用HanLP(1.7.0)分词示例

    HanLP分词,如README中所说,如果没有特殊需求,可以通过maven配置,如果要添加自定义词典,需要下载“依赖jar包和用户字典". 分享某大神的示例经验: 是直接"java ...