初始化Guava ImmutableMap


140

番石榴提供了一个不错的快捷方式来初始化地图。但是,当我的地图初始化为9个条目时,出现以下编译器错误(Eclipse Indigo)。

of(K, V, K, V, K, V, K, V, K, V)类型中的方法ImmutableMap不适用于参数 (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

该消息似乎表明

ImmutableMap的最大大小为四对键值。

显然,情况并非如此,但我不知道该怎么做才能增加初始化程序的大小。

有人可以告诉我缺少了什么吗?

Answers:


256

请注意,您的错误消息仅包含五K, V对,总共10个参数。这是设计使然;ImmutableMap类提供了六种不同的of()方法,接受零到五个键值对。没有of(...)重载接受varags参数,因为KV可以是不同的类型。

您想要一个ImmutableMap.Builder

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

感谢您的快速解答。我决定尝试使用番石榴,因为我不想键入标准地图初始化程序所需的所有“ puts”。这个想法实在太多了!
user903724

7
@ user903724:在这里使用番石榴的主要原因是强大的不变性,IMO。
乔恩·斯基特

2
那样,或者说稍微减少了内存消耗,而且随着事情的发展,生成器的语法非常流利。
Louis Wasserman '02

2
好吧,您可能仍然有多个看跌期权,但是它们现在使用的是流畅的API,因此无需重复myMap执行.put
凯文·韦尔克

21
还请注意,Jon的示例代码可能是a public static final,并且仍然有效,不需要辅助方法或static{}初始化程序!
凯文·布兰里恩'02

62

如果地图很短,您可以执行以下操作:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

如果更长,则:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

9
除了可读性之外,您最多可以将ImmutableMap.of静态工厂用于五个键值对。然后,您必须使用构建器。
Xaerxess 2012年

0

“ put”已被弃用,不要使用它,而应使用.of代替

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);

3
否。不建议使用ImmutableMap.put。乔恩·斯凯特(Jon Skeet)使用的是ImmutableMap.Builder.put,这正是我们初始化包含5个以上元组的地图的确切方式。
i2B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.