Java Apache CollectionUtils 源碼閱讀筆記,注意3.2版本bug

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方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章