2012-05-17 27 views
29

如果我想創建一個新的Multimap之用簡單的默認值,我curently需要做的是這樣的:緊湊的方式來創建番石榴多圖嗎?

private final Multimap<Key, Value> providersToClasses = Multimaps 
     .newListMultimap(
       new HashMap<Key, Collection<Value>>(), 
       new Supplier<List<Value>>() { 
        @Override 
        public List<Value> get() { 
         return Lists.newArrayList(); 
        } 
       }); 

因爲Java不能推斷正確的類型,如果用於底層映射Maps.newHashMap。當然,這可以重構成一個單獨的方法,但是有沒有辦法更簡潔地編寫它?

回答

49

爲什麼你不使用ArrayListMultimap.create()這樣一個簡單的情況?這是創建簡單的HashMap/ArrayList的默認方式,它可能是最常用的multimap。

+2

我想你的意思是'ArrayListMultimap'。'HashMultimap'用於'HashMap' /'HashSet'。 –

+0

是的,我的意思是ArrayListMultimap。感謝編輯。 –

+3

因爲我在找錯類('Multimaps'):) –

2

但是,要回答原始類型推斷問題,您還可以使用Maps.<Key, Collection<Value>>newHashMap()指定靜態方法的泛型類型,但它肯定不比new HashMap<Key, Collection<Value>>()更簡潔(它可能更一致)。

7

編寫客戶端和構建查詢參數映射時遇到此問題。一個漂亮簡潔的圖案,我喜歡爲構建屈德寧是使用ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
    ImmutableMultimap.<String, String>builder() 
    .put("key-1", "value-1") 
    .put("key-1", "value-2") 
    .build(); 
3

在Java 8,這是好多了,各種屈德寧的。這有兩個原因:

它看起來像這樣:

Multimap<Key, Value> providersToClasses = 
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new); 
4

這裏是緊湊的解決方案:

Multimap<Integer, String> multi = HashMultimap.create(); 
6

Guava documentation指出的create方法,通過一些其他的答案倡導 「很快就會過時」贊成下面提出的不同形式,因此應該避免。

番石榴21.0起,創建其中值存儲在ArrayList正宗Multimap對象的推薦方法如下:

MultimapBuilder.hashKeys().arrayListValues().build(); 

如果要指定期望的數量也可以使用參數在地圖鍵和預期的數值的每個鍵的:

MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build(); 

最後,你可以從一個存在的創建一個新的Multimap採用這種結構荷蘭國際集團之一:

MultimapBuilder.hashKeys().arrayListValues().build(multimap); 

如果你想使用ArrayLists其他數據結構在Multimap,你可以通過一些其他的替代的調用arrayListValues(),上市here