Guava多圖指南

1.概述

在本文中,我們將研究Google Guava庫中的Map實現之一– Multimap 。它是一個將鍵映射到值的集合,類似於java.util.Map ,但是其中每個鍵都可以與多個值關聯。

2. Maven依賴

首先,讓我們添加一個依賴項:

<dependency>

 <groupId>com.google.guava</groupId>

 <artifactId>guava</artifactId>

 <version>29.0-jre</version>

 </dependency>

最新版本可在此處找到。

3. Multimap之實施

對於Guava Multimap,如果我們為同一個鍵添加兩個值,則第二個值將不會覆蓋第一個值。相反,我們在結果map中將有兩個值。讓我們看一個測試用例:

String key = "a-key";

 Multimap<String, String> map = ArrayListMultimap.create();



 map.put(key, "firstValue");

 map.put(key, "secondValue");



 assertEquals(2, map.size());

打印Map內容將輸出:

{a-key=[firstValue, secondValue]}

當我們通過鍵“ a-key”獲取值時,將得到Collection ,其結果包含“ firstValue”和“ secondValue”:

Collection<String> values = map.get(key);

打印值將輸出:

[firstValue, secondValue]

4.與標準Map相比

java.util包中的標準映射無法使我們能夠將多個值分配給同一鍵。讓我們考慮一個簡單的例子,當我們使用相同的鍵兩個值放入()Map中時

String key = "a-key";

 Map<String, String> map = new LinkedHashMap<>();



 map.put(key, "firstValue");

 map.put(key, "secondValue");



 assertEquals(1, map.size());

由於第二個put()操作將覆蓋第一個值因此生成的映射僅具有一個元素( “ secondValue”) 。如果我們想要實現與Guava的Multimap相同的行為我們將需要創建一個以List 作為值類型的Map

String key = "a-key";

 Map<String, List<String>> map = new LinkedHashMap<>();



 List<String> values = map.get(key);

 if(values == null) {

 values = new LinkedList<>();

 values.add("firstValue");

 values.add("secondValue");

 }



 map.put(key, values);



 assertEquals(1, map.size());

顯然,使用起來不是很方便。而且,如果我們的代碼中有此需求,那麼Guava的Multimap可能比java.util.Map更好

這裡要注意的一件事是,儘管我們有一個包含兩個元素的列表,但size()方法返回1。在Multimap中,size()返回存儲在Map中的實際值個數keySet()。size ()返回不同鍵的數量。

5. Multimap的優點

多重Map通常用於原本會出現Map <K,Collection >的地方。區別包括:

  • 在使用put()添加條目之前,無需填充空集合。
  • get()方法從不返回null ,而僅返回一個空集合(我們不需要像Map <String,Collection >測試用例那樣對null進行檢查)
  • 當且僅當鍵映射到至少一個值時,該鍵才包含在Multimap中。任何導致鍵具有零關聯值的操作都具有從Multimap中刪除該鍵的效果(在Map <String,Collection >中,即使我們從集合中刪除了所有值,我們仍然保留一個空的Collection作為一個值,這是不必要的內存開銷)
  • 總條目值計數可作為size()獲得

六,結論

本文介紹瞭如何以及何時使用Guava Multimap。它將其與標準java.util.Map進行比較,並顯示了Guava Multimap的優點

所有這些示例和代碼片段都可以在GitHub項目中找到–這是一個Maven項目,因此應易於導入和運行。