Initializing HashMaps in Java
How can I initialize a HashMap with some pre-defined entries?
In this article I’ll show you how you create a HashMap with values. Java doesn’t provide a method like Array.asList(). For initializing a map you have to implement something like that:
//Old fashion way Map<Integer, String> oldFashion = new HashMap<Integer, String>() {{ put(1, "one"); put(2, "two"); }};
So this is the double brace initialization idom. I don’t like this way. It’s not very readable, it’s creates a new class every time and may cause a memory leak. That’s may be okay for tests.
But as you know there isn’t just one way of doing it. With Java 8 you can solve my problem with a Lambda Expression.
//Java 8 Lambda way Map<Integer, String> lambdaMap = Stream.of( new SimpleEntry<Integer, String>(1, "one"), new SimpleEntry<Integer, String>(10, "ten")) .collect( Collectors.toMap((se) -> se.getKey(), (se) -> se.getValue()) );
There are new methods added to java.util.Arrays to convert an array into a java.util.stream.Stream which can be used for summing, multiplying or collecting. Mmmh, I think that’s a lot of code for just initializing a Map with values.
Okay, let’s see what Guava can do for us.
//Guava way ImmutableMap<Integer, String> guavaMap = ImmutableMap.of( 1, "one", 2, "two" ); //Guava way with builder ImmutableMap<Integer, String> guavaMap2 = ImmutableMap.<Integer, String> builder() .put(1, "one") .put(2, "two") .put(15, "fifteen") .build();
Guava has a Factory Method ImmutableMap.of() which returns a immutable map containing our values. The Library has also a ImmutableMap.Builder<K,V>.build() method.
Lesson Learned
The Guava way is my favorite. It’s typed, safe, short and readable. If you are afraid of Guava, then consider the plain old way. The Java 8 Lambda Stream way is pretty ugly.
Examples on Github