apache.commons.collections4用法



apache.commons.collections4用法

apache.commons.collections4用例
工具类:
每个主要的集合接口都有一个utility类。因此,set和sortedset接口的utility类就是setutils。这些utility类提供了操作集合类型的共通方法。
基本的方法都包含在两个根集合接口的utility类中,即collectionutils和maputils。因为所有的其他集合接口都集成collection或者map,所以collectionutils和maputils可以被扩展使用。共同的方法包括交集操作、计数操作、迭代操作、逻辑操作和类型强制转换操作等。同时,utility类还提供了对集合封装类的访问,这与jdk collections类的方式类似。
1. maps:
1.map迭代
jdk中的map接口很难进行迭代。api用户总是需要通过entryset或者keyset进行迭代。commons-collectons现在提供了一个新的接口—mapiterator来允许对maps进行简单的迭代。
IterableMap iterableMap = (IterableMap) new HashMap();
MapIterator it = iterableMap.mapIterator();
while(it.hasNext()){
Object key = it.next();
Object value = it.getValue();
// it.setValue(newValue);
}
2.有序map
commons-collections为maps提供了一个新的接口,orderedmap,这个接口是有顺序的,但是并没有进行排序。linkedmap和listorderedmap(封装器)是这个接口的两种实现。这个接口支持map迭代,同时允许对map进行前向迭代和反向迭代。
package collections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.OrderedMap;
import org.apache.commons.collections4.bidimap.TreeBidiMap;
import org.apache.commons.collections4.map.LinkedMap;

public class MapTest {


public static void main(String[] args) {
/**
* 得到集合里按顺序存放的key之后的某一Key
*/
OrderedMap map = new LinkedMap();
map.put(“FIVE”, “5″);
map.put(“SIX”, “6″);
map.put(“SEVEN”, “7″);
map.firstKey(); // returns “FIVE”
map.nextKey(“FIVE”); // returns “SIX”
map.nextKey(“SIX”); // returns “SEVEN”

/**
* BidiMap
* 通过key得到value
* 通过value得到key
* 将map里的key和value对调
*/
BidiMap bidi = new TreeBidiMap();
bidi.put(“SIX”, “6″);
bidi.get(“SIX”); // returns “6″
bidi.getKey(“6″); // returns “SIX”
// bidi.removeValue(“6″); // removes the mapping
BidiMap inverse = bidi.inverseBidiMap(); // returns a map with keys and values swapped
System.out.println(inverse);

/**
* CollectionUtils.retainAll
* 得到两个集合中相同的元素
*/
List<String> list1 = new ArrayList<String>();
list1.add(“1″);
list1.add(“2″);
list1.add(“3″);
List<String> list2 = new ArrayList<String>();
list2.add(“2″);
list2.add(“3″);
list2.add(“5″);
Collection c = CollectionUtils.retainAll(list1, list2);
System.out.println(c);
}

}

2. queues&buffers 队列和缓冲
buffer接口用来支持队列和缓冲。这些接口表示集合可以定义删除的顺序。
fifo(队列)、lifo(堆栈)和priority(根据比较器的顺序)的接口实现已经被提供。
Buffer buffer = new UnboundedFifoBuffer();
buffer.add(“one”);
buffer.add(“two”);
buffer.add(“three”);
buffer.remove(); //removes and returns the next in order,”one” as this is a fifo
buffer.remove(); //removes and returns the next in order,”two” as this is a fifo
3. bags
bag接口用于支持bag。它用于表示包含了一个对象的多个拷贝的结合。
Bag bag = new HashBag();
bag.add(“one”,6); //add 6 copies of “one”
bag.remove(“one”,2); //removes 2 copies of “one”
bag.getCount(“one”); //returns 4
对于排序和为排序的bag,具有对应的接口实现。
® bag接口
® 固定大小的map、lru (最近最少使用算法)map和双重(dual)map
® 对象数组和map的迭代器
® map的multikey
® 大量的工具类,提供了使用api的快捷方式
® 封装器,对大多数类提供了自定义的方法
4. org.apache.commons.collections
这个包中定义了由其他包实现的接口、作为工厂类(可以实例化集合类或者集合的封装类)的共通类。一些比较重要的类有arraystack、beanmap、extendedproperties、fastarraylist、fasthashmap和fasttreemap。这些类的细节包含在javadoc中,下面只是简要的介绍各个类在实际中的应用:
arraystack:arraystack类实现了stack接口,基于arraylist用来在单线程环境中使用。例如,如果想在一个方法中使用stack进行一些处理,这个类在性能上会比stack(jdk1.4.2中使用vector)好一些。
beanmap:就像swing gui中的jbutton一样,使用beanmap,甚至可以将一个map作为一个javabean来进行处理。当在设计用来显示数据源或者应用程序配置属性的gui时,map可以在屏幕上被拖放(d&d)。
extendedproperties:这是一个非常有用的类。它和java.util.properties类似,包含了一个用于加载配置信息的load方法,但是这个类有以下的好处:
# 属性值可以分布在多行
# 提供了用于获取非字符串值的方法。例如,getfload方法用于获取一个fload类型的值。这样就不需要使用wrapper方法来转换获取的字符串值了。
fastarraylist, fasthashmap, fasttreemap:这些类可以在多线程环境中使用,如果存在很多只读操作的话。这些类是分别基于arraylist、hashmap和treemap的。
5. org.apache.commons.collections.bag
如果需要将一个对象的多个拷贝添加到一个list中时,这个包下面的类就变得非常有用了。在这种情况下,很多开发人员会将对象添加到一个arraylist中,然后每天加一次都要进行一下迭代,来判断是否添加了给定类型的对象。在线购物车是这种情况的一个实际的需求。这种方法的缺点是内存和速度上的不足。
解决上述需求的一个比较好的设计就是只保存一个对象的拷贝,而在添加同样类型的实体时,只是增加计数器的值。hashbag和treebag类(分别基于hashmap和treemap)很好的满足了这个需求。
6. org.apache.commons.collections.bidimap
很多java开发人员通过使用两个hashmap来获取一个键值,方法是将一个值作为键传递到另外一个hashmap。正常情况下,需要对同等的处理名字和值,在这种情况下,就是值也可以做为键(因为在map中键是唯一的,而值是可以不唯一的)。
关于org.apache.commons.collections.bidimap的例子是一个原型适配器,集成了peoplesoft和siebel命令行处理引擎,假定一个引擎中的每个命令在另外一个中都有同样的对应。可以在in.co.narayanan.commons.collections.bidimap中找到相关的类。可以通过siebelpeoplesoftconnector来了解这些类,siebelpeoplesoftconnector作为适配器,并包含了bidimap对象。当收到处理siebel命令的请求后,就从bidimap获取对应的peoplesoft命令,然后传送给peoplesoft命令引擎。反之亦然。样例代码中只包含应用程序的一个轮廓。
7. org.apache.commons.collections.buffer
这个包中包含了封装类,直接实现了java.util.collection接口。因此,任何实现collection接口的类都可以使用这些封装类。比较常用的类有predicatedcollection、compositecollection、synchronizedcollection、transformedcollection、typedcollection和unmodifiablecollection。下表提供了关于这些类的一个概览:
predicatedcollection:可以通过使用这个类的实例来追加限制条件,将条件定义成一个独立的对象,也就是所谓的前提条件,然后作为参数传送给封装类的工厂方法。
? compositecollection:使用这个类可以创建集合的集合,并且当添加或者删除对象时具有一个统一的视图。
? synchronizedcollection:可以使既存的集合线程安全。
? transformedcollection:当将对象添加到集合时转换对象的类型。例如由string–>integer。
? typedcollection:与java 1.5类似的泛型。
? unmodifiablecollection:使集合的引用不可以被修改。
8. org.apache.commons.collections.comparators
这个包中包含了很多可复用的类。nullcomparator类和fixedordercomparator是最常用的类。
nullcomparator:当对数组或者列表中的实体进行排序时,将null实体移到底部。
fixedordercomparator:将一个集合中的顺序重新保存在预定义的列表中。
9. org.apache.commons.collections.functors
10. org.apache.commons.collections.iterators
在这个包中包含了很多实现了java.util.iterator接口的类。比较重要的类有mapiterator、arrayiterator、collatingiterator、loopingiterator和iteratorutils。需要通过使用iteratorutils类来使用这个包中的类。
11. org.apache.commons.collections.keyvalue
这个包中的multikey类非常有用。如果想要在应用程序中创建一个域(domain)对象并将它们存储在一个基于联合逐渐的map中,就可以通过创建一个multikey的实例,使用记录的主键的值作为参数。然后将这个实例传递给map来存储域对象。
这个包中的类的其他用途是存储locale相关的实体,在这种情况下,实际的主键和locale name联合组成key。
12. org.apache.commons.collections.list
treelist、fixedsizelist、nodecachinglinkedlist、cursorablelinkedlist、transformedlist和predicatedlist类都是这个包中比较重要的类。它们的javadoc也非常清楚的描述了各自的功能。
13. org.apache.commons.collections.map
caseinsensitivemap、compositemap、fixedsizemap、flat3map、lazymap、linkedmap、lrumap、multikeymap、predicatedmap、singletonmap和staticbucketmap类都比较有用。