初始化番石榴不可变地图

2022-08-31 07:05:01

番石榴为初始化地图提供了一个很好的快捷方式。但是,当我的映射初始化为九个条目时,我收到以下编译器错误(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"
        );

该消息似乎说

一个不可变映射的最大大小为四对键,值。

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

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


答案 1

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

答案 2

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

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

如果它更长,那么:

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