Apache Commons是Apache软件基金会的项目,曾经隶属于Jakarta项目。Commons的目的是提供可重用的、解决各种实际的通用问题且开源的Java代码。Commons由三部分组成:Proper(是一些已发布的项目)、Sandbox(是一些正在开发的项目)和Dormant(是一些刚启动或者已经停止维护的项目)。
Commons Collections包为Java标准的Collections API提供了相当好的补充。在此基础上对其常用的数据结构操作进行了很好的封装、抽象和补充。让我们在开发应用程序的过程中,既保证了性能,同时也能大大简化代码。
注意:Commons Collections的最新版是4.1,但由于工作中大多还是3.x的版本,这里就以3.x中的最后一个版本3.2.2作使用介绍。
以下是Collections的包结构和简单介绍,如果你想了解更多的各个包下的接口和实现,请参考Apache Commons Collections 3.2.2 API文档。
org.apache.commons.collections // – CommonsCollections自定义的一组公用的接口和工具类
org.apache.commons.collections.bag // – 实现Bag接口的一组类
org.apache.commons.collections.bidimap // – 实现BidiMap系列接口的一组类
org.apache.commons.collections.buffer // – 实现Buffer接口的一组类
org.apache.commons.collections.collection // –实现java.util.Collection接口的一组类
org.apache.commons.collections.comparators // – 实现java.util.Comparator接口的一组类
org.apache.commons.collections.functors // –Commons Collections自定义的一组功能类
org.apache.commons.collections.iterators // – 实现java.util.Iterator接口的一组类
org.apache.commons.collections.keyvalue // – 实现集合和键/值映射相关的一组类
org.apache.commons.collections.list // – 实现java.util.List接口的一组类
org.apache.commons.collections.map // – 实现Map系列接口的一组类
org.apache.commons.collections.set // – 实现Set系列接口的一组类
Collections包中的“Map”是在java.util.Map的基础上扩展的接口和类。有如下常用的Map:
/**
* 构建map初始数据
* @param map
*/
private static Map buildMap(Map map) {
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
map.put("four", "4");
return map;
}
使用MapIterator迭代数据的方法:
/**
* map迭代器
* 遍历打印map,使用map.mapIterator()
* @param map
* @param mapName
*/
private static void iteratorMap() {
Map map = this.buildMap(new HashMap());
// 遍历map,使用MapIterator
MapIterator it = map.mapIterator();
while (it.hasNext()) {
Object key = it.next();
Object value = it.getValue();
System.out.println("iterator map key:" + key + ", value: " + value);
}
}
/**
* 有序map之LinkedMap
*/
private static void linkedMapTest() {
OrderedMap orderMap = this.buildMap(new LinkedMap());
// 获取map中相应的值
System.out.println("LinkedMap firstKey:" + orderMap.firstKey());
System.out.println("LinkedMap previous key:" + orderMap.previousKey("four"));
System.out.println("LinkedMap next key:" + orderMap.nextKey("two"));
System.out.println("LinkedMap last key:" + orderMap.lastKey());
System.out.println("LinkedMap map Size:" + orderMap.size());
}
/**
* BidiMap,是双向Map
* 通过key得到value
* 通过value得到key
* 注意的是BidiMap,当中不光key不能重复,value也不可以。
*/
private static void bidiMapTest() {
BidiMap bidiMap = this.buildMap(new TreeBidiMap());
// 有相同值的,只有最后一个生效
bidiMap.put("san", "3");
loopMap(bidiMap, "BidiMap");
// 获取map中相应的值
System.out.println("BidiMap getKey:" + bidiMap.getKey("2"));
System.out.println("BidiMap getMoreSameKey:" + bidiMap.getKey("3"));
// 移除map的value
bidiMap.removeValue("3");
System.out.println("BidiMap getMoreSameKey2:" + bidiMap.getKey("3"));
// 交换map的key和value
BidiMap inversMap = bidiMap.inverseBidiMap();
}
private static void multiMapTest() {
MultiMap multiMap = new MultiValueMap();
multiMap = multibuildMap(multiMap);
multiMap.put("three", "5");
List<String> list = (List<String>) multiMap.get("three");
// 会打印: list:[3, 5]
System.out.println("list:" + list);
}
/**
* LazyMap.类似与Hibenrate的懒加载,在声明的时候并不会创建,
* 而是在使用(get)的时候,才创建集合的内容,返回Factory的返回值
* 实现懒加载,当我们觉得没有必要去初始化一个Map而又希望它可以在必要时自动处理数据可以使用LazyMap
* 有LazyList与LazyMap对应
*/
private static void lazyMapTest() {
//创建一个工厂,实现create方法
Factory factory = new Factory() {
@Override
public Object create() {
// 创建的默认值
return "这是LazyMap get()不到时创建的默认值";
}
};
Map lazyMap = LazyMap.decorate(new HashMap(), factory);
System.out.println("map:" + lazyMap);
//当此lazyMap调用get(key)时,如果无此key则返回varFactory里create方法返回的值
System.out.println("map:" + lazyMap.get("hello"));
// 有key对应的值时,返回123
lazyMap.put("hello", "123");
System.out.println("map:" + lazyMap.get("hello"));
}