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 list1 = new ArrayList();
     list1.add("1");
     list1.add("2");
     list1.add("3");
     List list2 = new ArrayList();
     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类都比较有用。


你可能感兴趣的:(Apache)