C# to Java - Dictionaries?
Is it possible in Java to make a Dictionary with the items already declared inside it? Just like the below C# code:
Dictionary<string, int> d = new Dictionary<string, int>()
{
{"cat", 2},
{"dog", 1},
开发者_Go百科{"llama", 0},
{"iguana", -1}
};
How do I do this and what type do I use? I've read that Dictionary is obsolete.
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:
- They don't allow you to specify what Map implementation is used
- They only create immutable maps
- They don't create an anonymous subclass of Map
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);
}};
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]);
}
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)
);
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.
精彩评论