初始化Guava ImmutableMap

use*_*724 131 java dictionary guava

Guava为初始化地图提供了一个很好的快捷方式.但是,当我的地图初始化为九个条目时,我得到以下编译器错误(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"
        );
Run Code Online (Sandbox Code Playgroud)

该消息似乎表明了这一点

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

显然,情况并非如此,但我无法弄清楚如何增加初始化程序的大小.

有人能告诉我缺少什么吗?

Jon*_*eet 240

请注意,您的错误消息仅包含五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();
Run Code Online (Sandbox Code Playgroud)

  • 另请注意Jon的示例代码如何成为`public static final`并且它仍然有效,不需要辅助方法或`static {}`初始化程序! (19认同)
  • @ user903724:在这里使用番石榴的主要原因是强大的不变性,IMO. (6认同)
  • 那个,或者内存消耗略有减少 - 以及构建器语法非常流畅. (2认同)
  • 好吧,你可能还有多个put,但是他们现在正在使用流畅的API,所以不需要为每个`.put`重复`myMap`. (2认同)

Nat*_*ger 60

如果地图很短,你可以这样做:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs
Run Code Online (Sandbox Code Playgroud)

如果它更长,那么:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Run Code Online (Sandbox Code Playgroud)

  • 除了可读性之外,您还可以使用`ImmutableMap.of`静态工厂最多五个键值对.然后你必须使用builder. (9认同)