Is it possible in Java to make a Dictionary with the items already declared inside it? Just like the below C# code:
Dictionary d = new
Java7 almost introduced "collection literals" that would allow syntax like that. They'll probably try to shove it in Java8. I have no idea what is wrong with these people.
This can be easily achieved by some kind of wrapper API
Map<String,Integer> map = Maps.<String,Integer>empty()
.put("cat", 2).put("dog",1)....;
Not too bad. I would prefer something like
map("cat", "dog", ... )
.to( 1, 2, ... );
This kind of thing must have been implemented by various people, unfortunately the standard API doesn't inculde such things.
If you use the Guava library, you can use its ImmutableMap
class, either by itself (examples 1 and 2), or as an initializer for a HashMap (examples 3 and 4):
Map<String, Integer> map1 = ImmutableMap.<String, Integer> builder()
.put("cat", 2)
.put("dog", 1)
.put("llama", 0)
.put("iguana", -1)
.build();
Map<String, Integer> map2 = ImmutableMap.of(
"cat", 2,
"dog", 1,
"llama", 0,
"iguana", -1
);
Map<String, Integer> map3 = Maps.newHashMap(
ImmutableMap.<String, Integer> builder()
.put("cat", 2)
.put("dog", 1)
.put("llama", 0)
.put("iguana", -1)
.build()
);
Map<String, Integer> map4 = Maps.newHashMap( ImmutableMap.of(
"cat", 2,
"dog", 1,
"llama", 0,
"iguana", -1)
);
Bite the bullet and type out the map name!
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("cat", 2);
map.put("dog", 1);
map.put("llama", 0);
map.put("iguana", -1);
You could also do something like this, which might save some typing with a long list:
Object[][] values = {
{"cat", 2},
{"dog", 1},
{"llama", 0},
{"iguana", -1}
};
for (Object[] o : values) {
map.put((String) o[0], (Integer) o[1]);
}
This will do what you want:
Map<String,Integer> map = new HashMap<String, Integer>(){{
put("cat", 2);
put("dog", 1);
put("llama", 0);
put("iguana", -1);
}};
This statement creates an anonymous subclass of HashMap, where the only difference from the parent class is that the 4 entries are added during instance creation. It's a fairly common idiom in the Java world (although some find it controversial because it creates a new class definition).
Because of this controversy, as of Java 9 there is a new idiom for conveniently constructing maps: the family of static Map.of methods.
With Java 9 or higher you can create the map you need as follows:
Map<String, Integer> map = Map.of(
"cat", 2,
"dog", 1,
"llama", 0,
"iguana", -1
);
With larger maps, this alternative syntax may be less error-prone:
Map<String, Integer> map = Map.ofEntries(
Map.entry("cat", 2),
Map.entry("dog", 1),
Map.entry("llama", 0),
Map.entry("iguana", -1)
);
(This is especially nice if Map.entry is statically imported instead of being referenced explicitly).
Besides only working with Java 9+, these new approaches are not quite equivalent to the previous one:
However, these differences shouldn't matter for many use cases, making this a good default approach for newer versions of Java.
Map<String,Integer> map = new HashMap<String, Integer>(){{
put("cat", 2);
put("dog", 1);
put("llama", 0);
put("iguana", -1);
}};