IMLC.ME

如何创建 Map

基础做法 Basic Approach

Map<String, String> emoji = new HashMap<>();
emoji.put("happy", "😄");
emoji.put("sad",   "😭");
emoji.put("angry", "😡");

Java Collections

Collections.singletonMap("happy", "😄");

Java Stream API

Array
Map<String, String> emoji = Stream.of(new String[][]{
        {"happy", "😄"},
        {"sad",   "😭"},
        {"angry", "😡"},
    }).collect(Collectors.toMap(data -> data[0], data -> data[1]));
SimpleEntry
Map<String, String> map = Stream.of (
    new AbstractMap.SimpleEntry<>("happy", "😄"),
    new AbstractMap.SimpleEntry<>("sad",   "😭" ),
    new AbstractMap.SimpleEntry<>("angry", "😡")
    )
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
SimpleImmutableEntry
Map<String, String> map = Stream.of(
    new AbstractMap.SimpleImmutableEntry<>("happy", "😄"),
    new AbstractMap.SimpleImmutableEntry<>("sad",   "😭" ),
    new AbstractMap.SimpleImmutableEntry<>("angry", "😡"))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
UnmodifiableMap
Map<String, String> emoji = Stream.of(new String[][] {
        {"happy", "😄"},
        {"sad",   "😭"},
        {"angry", "😡"},
    }).collect(Collectors.collectingAndThen(
        Collectors.toMap(data -> data[0], data -> data[1]),
        Collections::<String, String> unmodifiableMap));

Java 9 Map.of()

Java 9 引入的 Map.of() 支持从 0 到 10 个元素对。

Map<String, String> emptyMap = Map.of();
Map<String, String> singletonMap = Map.of("happy", "😄");
Map<String, String> map = Map.of("happy", "😄", "sad", "😭", "angry", "😡");

又或者 Map.ofEntries()。

Map<String, String> map = Map.ofEntries(
        new AbstractMap.SimpleEntry<>("happy", "😄"),
        new AbstractMap.SimpleEntry<>("sad",   "😭"),
        new AbstractMap.SimpleEntry<>("angry", "😡")
    );

Guava

Map<String, String> emoji 
  = ImmutableMap.of("happy", "😄", "sad", "😭", "angry", "😡");

双花括号初始化 Double Brace Syntax

Map<String, String> emoji = new HashMap<>() {{
  put("happy", "😄");
  put("sad",   "😭");
  put("angry", "😡");
}};

这个方法很少见,同时非常不建议使用。 由于其实现原理会持有外部类引用,很容易造成内存泄露。 放这里就当笑话看吧。