C# to Java - Dictionaries?

后端 未结 5 1181
伪装坚强ぢ
伪装坚强ぢ 2020-12-25 09:41

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          


        
相关标签:
5条回答
  • 2020-12-25 10:30

    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.

    0 讨论(0)
  • 2020-12-25 10:32

    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)
    );
    
    0 讨论(0)
  • 2020-12-25 10:33

    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]);
        }
    
    0 讨论(0)
  • 2020-12-25 10:37

    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.

    0 讨论(0)
  • 2020-12-25 10:37
    Map<String,Integer> map = new HashMap<String, Integer>(){{
    put("cat", 2);
    put("dog", 1);
    put("llama", 0);
    put("iguana", -1);
    }};
    
    0 讨论(0)
提交回复
热议问题