initializing a Guava ImmutableMap
JavaDictionaryGuavaJava Problem Overview
Guava offers a nice shortcut for initializing a map. However I get the following compiler error (Eclipse Indigo) when my map initializes to nine entries.
The method of(K, V, K, V, K, V, K, V, K, V)
in the type ImmutableMap
is not applicable for the arguments
(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"
);
The message appears to say that
> An ImmutableMap has a maximum size of four pairs of key,value.
Obviously, this cannot be the case but I can't figure out what to do to increase the size of my initializer.
Can someone tell me what is missing?
Java Solutions
Solution 1 - Java
Notice that your error message only contains five K, V
pairs, 10 arguments total. This is by design; the ImmutableMap class provides six different of()
methods, accepting between zero and five key-value pairings. There is not an of(...)
overload accepting a varags parameter because K
and V
can be different types.
You want an 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();
Solution 2 - Java
if the map is short you can do:
ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs
If it is longer then:
ImmutableMap.builder()
.put(key, value)
.put(key2, value2)
// ...
.build();
Solution 3 - Java
If you want a balance between capability and readability, you may combine both approaches:
ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
.putAll(ImmutableMap.of(
"key1", "value1",
"key2", "value2",
"key3", "value3",
"key4", "value4"));
.putAll(ImmutableMap.of(
"key5", "value5",
"key6", "value6",
"key7", "value7",
"key8", "value8",
"key9", "value9"));
.build();
Whether or not this is a good idea, is something open to discussion.