initializing a Guava ImmutableMap

JavaDictionaryGuava

Java 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser903724View Question on Stackoverflow
Solution 1 - JavaJon SkeetView Answer on Stackoverflow
Solution 2 - JavaNathan FegerView Answer on Stackoverflow
Solution 3 - JavaHaroldo_OKView Answer on Stackoverflow