在Google集合中静态初始化Maps的最佳方法

时间:2012-08-31 15:25:11

标签: java guava

静态初始化可修改地图的最佳方法是什么?我发现只有

ImmutableMap.of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)

但是这种方式创建了不可变映射并包含固定的参数列表。

3 个答案:

答案 0 :(得分:21)

如果您确实需要of代码方式,可以使用:

myMap = Maps.newHashMap(ImmutableMap.of(k1, v1, k2, v2...));

此外,ImmutableMap.Builder是从复杂来源创建地图的另一种选择:

myMap = Maps.newHashMap(new ImmutableMap.Builder<K, V>()
                   .put(k1, v1) //One k-v pair 
                   .putAll(otherMap) //From other Map
                   .put(Maps.immutableEntry(k2, v3)) //From a Map Entry
                   ...
                   .build());

另外:我的代码不是ImmutableMap的初衷。如果Nawa坚持使用Guava库;)

答案 1 :(得分:3)

您实际上并不需要静态初始化。以下是什么问题?

Map<K, V> map = Maps.newHashMap();
map.put(k1, v1);
map.put(k2, v2);
// More put() calls

// map is now ready to use.

如果需要,您可以围绕它创建一个辅助方法,但是您只能创建许多不同的版本(1个条目,2个条目等)。在某些时候它不再有用了。

答案 2 :(得分:3)

对于可变集合来说,没有必要这样做。我能想到的唯一原因是,在创建最初的小型可变地图时,您希望有一个简写。如果您经常需要这种方法,请编写自己的实用方法:

public static <K,V> HashMap<K,V> newHashMap(K k1, V v1) {
    HashMap<K, V> map = new HashMap<>();
    map.put(k1, v1);
    return map;
}

public static <K,V> HashMap<K,V> newHashMap(K k1, V v1, K k2, V v2) {
    HashMap<K, V> map = new HashMap<>();
    map.put(k1, v1);
    map.put(k2, v2);
    return map;
}

...

只要您认为它仍然可读,就覆盖它。由于键和值的混合,在我看来这很快变得难以理解 - 即使格式正确也是如此。 Guava家伙以5个键值对来阻止了这一点,这太多了。