摘要:它主要做了件事初始化容器,并將元素添加到容器里維護這樣我們再調用的方法直接就返回了,不需要再次遍歷和統計的過程。維護實時的維護,及時刪除總結整體上是對底層的二次封裝,很好的處理了各種細節,比如子容器的判空處理,的計算效率,的維護等。
在日常開發中我們通常有需要對 List 容器進行分組的情況,比如對下面的list數據根據name字段來進行分組:
[ { "date":"2018-01-31", "name":"wuzhong", "socre":0.8 }, { "date":"2018-01-30", "name":"wuzhong", "socre":0.9 }, { "date":"2018-01-31", "name":"wuzhong2", "socre":0.8 } ]
通常我們的做法可能很自然的想到 Map
Map> map = new HashMap<>(); for (Item item : list){ List - tmp = map.get(item.getName()); if (null == tmp){ tmp = new ArrayList<>(); map.put(item.getName(),tmp); } tmp.add(item); }
很簡單, 但是代碼量有點多,特別是需要判斷List為null并初始化。
再用guava實現上述的功能:
MultimapmultiMap = ArrayListMultimap.create(); for (Item item : list){ multiMap.put(item.getName(),item); }
代碼量直接減少了一半...
怎么實現的我們直接跟著 ArrayListMultimap 的源碼進去,發現其父類和我們最初的設計一樣,也是用了 Map
abstract class AbstractMapBasedMultimapextends AbstractMultimap implements Serializable { private transient Map > map; private transient int totalSize;
接著我們繼續去看put方法的具體實現。
public boolean put(@Nullable K key, @Nullable V value) { Collectioncollection = map.get(key); if (collection == null) { collection = createCollection(key); if (collection.add(value)) { totalSize++; map.put(key, collection); return true; } else { throw new AssertionError("New Collection violated the Collection spec"); } } else if (collection.add(value)) { totalSize++; return true; } else { return false; } }
它主要做了2件事:
初始化容器,并將元素添加到容器里
維護 totalSize
這樣我們再調用 multimap.size()的方法直接就返回了,不需要再次遍歷和統計的過程。
疑問multimap 里 public List
Collection- wuzhong2 = multiMap.get("wuzhong2"); wuzhong2.clear(); System.out.println(multiMap.size()); //輸出2 System.out.println(multiMap.keySet()); //輸出 wuzhong
結果是顯而易見的,對guava返回的容器進行的操作的確是會影響它的宿主對象的。
具體的源碼可以看下 com.google.common.collect.AbstractMapBasedMultimap.WrappedList ,他用了代理模式,底層還是用了一個 Collection 容器。
private class WrappedCollection extends AbstractCollection總結{ final K key; Collection delegate; final WrappedCollection ancestor; final Collection ancestorDelegate; public void clear() { int oldSize = size(); // calls refreshIfEmpty if (oldSize == 0) { return; } delegate.clear(); totalSize -= oldSize; //維護實時的totalsize removeIfEmpty(); // //維護keyset,及時刪除 }
multimap 整體上是對java底層api的二次封裝,很好的處理了各種細節,比如子容器的判空處理,totalsize的計算效率, keys 的維護等 。 在接口的易用性上也非常貼合開發者。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68398.html
摘要:類關系實現方法是以為的特定實現,這個類中沒有太多的實際代碼,主要是方法中特定的產生一個作為。是的一個專有版本,這個類和接口一起,將的方法都重寫為。則是所有以為核心的的基本實現,這里實現了所有的方法,是最重要的一部分。 類關系 ArrayListMultiMap.java Multimap | | AbstractMultimap Serializa...
摘要:今天逛了逛,順手精選出了一下近幾個月以來上最熱門的個項目。相關閱讀正式開源,幫助應用快速容器化未來可能會上熱門的項目地址介紹哈哈,皮一下很開心。這是我自己開源的一份文檔,目前仍在完善中,歡迎各位英雄好漢一起完善。 showImg(https://segmentfault.com/img/remote/1460000015766827?w=391&h=220);今天逛了逛Github,順...
摘要:配合一下方法使用類似的方法,用于提取一個里頭的一個屬性出來。當然,也可以簡寫為主要用來過濾集合。配合使用功能與相同,只是把該篩選條件內置在中然后這里直接使用,傳入參數與功能相反集合分區只取出一個符合條件的計數與條件滿足判斷其他轉參考 Function 配合一下方法使用: collect flatCollect groupBy minBy maxBy toSortedListBy so...
摘要:第四章引入流一什么是流流是的新成員,它允許你以聲明性方式處理數據集合通過查詢語句來表達,而不是臨時編寫一個實現。 第四章 引入流 一、什么是流 流是Java API的新成員,它允許你以聲明性方式處理數據集合(通過查詢語句來表達,而不是臨時編寫一個實現)。就現在來說,你可以把它們看成遍歷數據集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼。 下面兩段代碼都是用來返回低...
摘要:實現了觀察者模式,使用方法非常簡單,可參考有用的二這篇文章主要講解的實現原理。一言以蔽之內部有一個,當時往中增加一個元素為事件的類型,為觀察者,時根據事件類型找到觀察者之后,對其反射調用。 EventBus實現了觀察者模式,使用方法非常簡單,可參考:有用的Guava(二) 這篇文章主要講解EventBus的實現原理。一言以蔽之:EventBus內部有一個map,當register時往m...
閱讀 2311·2021-10-11 10:59
閱讀 2602·2021-10-11 10:58
閱讀 3304·2021-09-08 09:35
閱讀 3783·2021-09-02 15:21
閱讀 1455·2019-08-30 15:53
閱讀 2608·2019-08-29 14:16
閱讀 2068·2019-08-26 14:00
閱讀 2942·2019-08-26 13:52