成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺析guava容器multimap

yy13818512006 / 3010人閱讀

摘要:它主要做了件事初始化容器,并將元素添加到容器里維護(hù)這樣我們再調(diào)用的方法直接就返回了,不需要再次遍歷和統(tǒng)計(jì)的過程。維護(hù)實(shí)時(shí)的維護(hù),及時(shí)刪除總結(jié)整體上是對底層的二次封裝,很好的處理了各種細(xì)節(jié),比如子容器的判空處理,的計(jì)算效率,的維護(hù)等。

在日常開發(fā)中我們通常有需要對 List 容器進(jìn)行分組的情況,比如對下面的list數(shù)據(jù)根據(jù)name字段來進(jìn)行分組:

[
    {
        "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> 的結(jié)構(gòu),比如代碼如下:

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);
}

很簡單, 但是代碼量有點(diǎn)多,特別是需要判斷List為null并初始化。

再用guava實(shí)現(xiàn)上述的功能:

Multimap multiMap = ArrayListMultimap.create();
for (Item item : list){
    multiMap.put(item.getName(),item);
}

代碼量直接減少了一半...

怎么實(shí)現(xiàn)的

我們直接跟著 ArrayListMultimap 的源碼進(jìn)去,發(fā)現(xiàn)其父類和我們最初的設(shè)計(jì)一樣,也是用了 Map> 作為數(shù)據(jù)的容器,但是多了一個(gè) totalSize 的字段。

abstract class AbstractMapBasedMultimap extends AbstractMultimap
    implements Serializable {
  private transient Map> map;
  private transient int totalSize;

接著我們繼續(xù)去看put方法的具體實(shí)現(xiàn)。

public boolean put(@Nullable K key, @Nullable V value) {
  Collection collection = 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件事:

初始化容器,并將元素添加到容器里

維護(hù) totalSize

這樣我們再調(diào)用 multimap.size()的方法直接就返回了,不需要再次遍歷和統(tǒng)計(jì)的過程。

疑問

multimap 里 public List get(@Nullable K key) 這個(gè)方法返回的是個(gè)List容器,如果我們直接對他操作,是不是也會影響totalsize呢?

Collection wuzhong2 = multiMap.get("wuzhong2");
wuzhong2.clear();
System.out.println(multiMap.size());     //輸出2
System.out.println(multiMap.keySet());   //輸出 wuzhong

結(jié)果是顯而易見的,對guava返回的容器進(jìn)行的操作的確是會影響它的宿主對象的。

具體的源碼可以看下 com.google.common.collect.AbstractMapBasedMultimap.WrappedList ,他用了代理模式,底層還是用了一個(gè) 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;    //維護(hù)實(shí)時(shí)的totalsize
      removeIfEmpty(); //      //維護(hù)keyset,及時(shí)刪除
    }
    
總結(jié)

multimap 整體上是對java底層api的二次封裝,很好的處理了各種細(xì)節(jié),比如子容器的判空處理,totalsize的計(jì)算效率, keys 的維護(hù)等 。 在接口的易用性上也非常貼合開發(fā)者。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68398.html

相關(guān)文章

  • [Java] 淺析Google Guava Multimap

    摘要:類關(guān)系實(shí)現(xiàn)方法是以為的特定實(shí)現(xiàn),這個(gè)類中沒有太多的實(shí)際代碼,主要是方法中特定的產(chǎn)生一個(gè)作為。是的一個(gè)專有版本,這個(gè)類和接口一起,將的方法都重寫為。則是所有以為核心的的基本實(shí)現(xiàn),這里實(shí)現(xiàn)了所有的方法,是最重要的一部分。 類關(guān)系 ArrayListMultiMap.java Multimap | | AbstractMultimap Serializa...

    yiliang 評論0 收藏0
  • 近幾個(gè)月Github上最熱門的Java項(xiàng)目一覽

    摘要:今天逛了逛,順手精選出了一下近幾個(gè)月以來上最熱門的個(gè)項(xiàng)目。相關(guān)閱讀正式開源,幫助應(yīng)用快速容器化未來可能會上熱門的項(xiàng)目地址介紹哈哈,皮一下很開心。這是我自己開源的一份文檔,目前仍在完善中,歡迎各位英雄好漢一起完善。 showImg(https://segmentfault.com/img/remote/1460000015766827?w=391&h=220);今天逛了逛Github,順...

    cyqian 評論0 收藏0
  • eclipse collections入門

    摘要:配合一下方法使用類似的方法,用于提取一個(gè)里頭的一個(gè)屬性出來。當(dāng)然,也可以簡寫為主要用來過濾集合。配合使用功能與相同,只是把該篩選條件內(nèi)置在中然后這里直接使用,傳入?yún)?shù)與功能相反集合分區(qū)只取出一個(gè)符合條件的計(jì)數(shù)與條件滿足判斷其他轉(zhuǎn)參考 Function 配合一下方法使用: collect flatCollect groupBy minBy maxBy toSortedListBy so...

    LeexMuller 評論0 收藏0
  • 《java 8 實(shí)戰(zhàn)》讀書筆記 -第四章 引入流

    摘要:第四章引入流一什么是流流是的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合通過查詢語句來表達(dá),而不是臨時(shí)編寫一個(gè)實(shí)現(xiàn)。 第四章 引入流 一、什么是流 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達(dá),而不是臨時(shí)編寫一個(gè)實(shí)現(xiàn))。就現(xiàn)在來說,你可以把它們看成遍歷數(shù)據(jù)集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼。 下面兩段代碼都是用來返回低...

    jeyhan 評論0 收藏0
  • EventBus原理

    摘要:實(shí)現(xiàn)了觀察者模式,使用方法非常簡單,可參考有用的二這篇文章主要講解的實(shí)現(xiàn)原理。一言以蔽之內(nèi)部有一個(gè),當(dāng)時(shí)往中增加一個(gè)元素為事件的類型,為觀察者,時(shí)根據(jù)事件類型找到觀察者之后,對其反射調(diào)用。 EventBus實(shí)現(xiàn)了觀察者模式,使用方法非常簡單,可參考:有用的Guava(二) 這篇文章主要講解EventBus的實(shí)現(xiàn)原理。一言以蔽之:EventBus內(nèi)部有一個(gè)map,當(dāng)register時(shí)往m...

    lsxiao 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<