您的位置:首页 > 运维架构 > Apache

Java Apache CollectionUtils 源码阅读笔记,注意3.2版本bug

2016-10-30 11:45 555 查看

union并集

以下是部分方法,并非是所有方法。

//通过set将a、b集合合并,如果某个对象在两个集合中出现,则新集合中该对象的数量取两个集合中该对象出现次数的较大数。
public static Collection union(final Collection a, final Collection b) {
ArrayList list = new ArrayList();
Map mapa = getCardinalityMap(a);//对象以及出现次数的map
Map mapb = getCardinalityMap(b);//对象以及出现次数的map
Set elts = new HashSet(a);
elts.addAll(b);
Iterator it = elts.iterator();
while(it.hasNext()) {
Object obj = it.next();
for(int i=0,m=Math.max(getFreq(obj,mapa),getFreq(obj,mapb));i<m;i++) {
list.add(obj);
}
}
return list;
}


intersection 交集

代码基本同union,区别:

将a、b集合合并,如果某个对象在两个集合中出现,则新集合中该对象的数量取两个集合中该对象出现次数的较小数。

retainAll 交集

retainAll方法用于从collection中去除不包含在retain中的元素,retain是要保留的元素。

public static Collection retainAll(Collection collection, Collection retain) {
return ListUtils.retainAll(collection, retain);
}

public static List retainAll(Collection collection, Collection retain) {
List list = new ArrayList(Math.min(collection.size(), retain.size()));

for (Iterator iter = collection.iterator(); iter.hasNext();) {
Object obj = iter.next();
if (retain.contains(obj)) {
list.add(obj);
}
}
return list;
}


removeAll 大bug

(在3.2版本中)其实现居然和retainAll一致,完全不是其描述的功能。慎用!

不过在4.0版本已经修复。

其功能是用来从一个集合中删除另外一个集合中出现的元素。

disjunction 析取

代码基本同union,区别: 如果某个对象在两个集合中出现,则新集合中该对象的数量取两个集合中该对象出现次数的差。

举例:

A: {1,2,2,2,3,3,4,5}

B: {3,4,4,5,6,7}

Disjunction: {1,2,2,2,3,4,6,7}

public static Collection disjunction(final Collection a, final Collection b) {
ArrayList list = new ArrayList();
Map mapa = getCardinalityMap(a);
Map mapb = getCardinalityMap(b);
Set elts = new HashSet(a);
elts.addAll(b);
Iterator it = elts.iterator();
while(it.hasNext()) {
Object obj = it.next();
for(int i=0,m=((Math.max(getFreq(obj,mapa),getFreq(obj,mapb)))-(Math.min(getFreq(obj,mapa),getFreq(obj,mapb))));i<m;i++) {
list.add(obj);
}
}
return list;
}


subtract方法

将a集合中的b集合元素全部去除,代码略

getCardinalityMap方法

获取集合中每个元素出现的次数map。

isSubCollection

如果 a是b的一个子集,返回true,注意,如果是子集需要满足,对于某个元素,b中的个数大于等于a中的格式。代码略

cardinality

obj 在集合中出现的次数

forAllDo闭包使用

public static void forAllDo(Collection collection, Closure closure) {
if (collection != null && closure != null) {
for (Iterator it = collection.iterator(); it.hasNext();) {
closure.execute(it.next());
}
}
}


filter、find

通过实现Predicate接口的一个方法,根据返回值去过滤或者查找某个obj

transform、collect

通过实现Transformer接口的一个方法,对每一个obj做方法内规定的操作。

对于一个collection,会被转换为一个list,对于list 会调用transform方法,对于非list的集合会调用collect方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: