原文: https://beginnersbook.com/2018/04/java-9-factory-methods-to-create-immutable-map/
在之前的教程中,我们了解了使用 Java 9 中引入的工厂方法创建不可变List和不可变Set。在本指南中,我们将学习**如何使用 Java 9 工厂方法创建不可变Map和Map.Entry。
1.在 Java 9 之前创建不可变Map
在我们看到如何使用 Java 9 工厂方法创建不可变Map之前,让我们看看我们在 Java 9 之前如何创建它们。
1.1 在 Java 9 之前创建空映射
我们曾经使用Collections类的unmodifiableMap()方法来创建不可修改的(不可变的)Map。
Map<String,String> map = new HashMap<String, String>();Map<String,String> immutableMap = Collections.unmodifiableMap(map);
让我们在 JShell 中测试一下。

1.2 在 Java 9 之前创建非空映射
Map<String,String> map = new HashMap<String, String>();map.put("Key1", "Jon");map.put("Key2", "Steve");map.put("Key3", "Mia");map.put("Key4", "Lora");Map<String,String> immutableMap = Collections.unmodifiableMap(map);
让我们在 JShell 中测试它。

2. Java 9 工厂方法创建不可变Map
Java 9 中引入了几种有用的工厂方法来创建不可修改的Map。我们将采用与上面相同的示例来比较 Java 9 中的事情变得更容易。在 Java 9 之前编写的代码行在工厂方法的帮助下大大减少了。
2.1 Java 9 - 使用Map.of()工厂方法的不可变空映射
我们用于空映射的方法:
static <K,V> Map<K,V> of()
示例:
Map<String,String> immutableMap = Map.of()
在 JShell 中测试:
jshell> Map<String,String> immutableMap = Map.of()immutableMap ==> {}
2.2 Java 9 - 使用Map.of(Key, Value ...)工厂方法创建不可变非空映射
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2...)
示例:
为了演示使用Map.of()工厂方法,我们采用了与上面使用unmodifiableMap()方法相同的示例。正如您所看到的,它在 Java 9 中是多么简单。我们在一行中减少了 6 行代码。
Map<String, String> immutableMap =Map.of("Key1", "Jon", "Key2", "Steve", "Key3", "Mia", "Key4", "Lora")
在 JShell 中测试:
jshell> Map<String, String> immutableMap =Map.of("Key1", "Jon", "Key2", "Steve", "Key3", "Mia", "Key4", "Lora")immutableMap ==> {Key3=Mia, Key4=Lora, Key1=Jon, Key2=Steve}
什么是不可变的映射?
- 不可变
Map不允许添加,删除和更新其元素。如果您尝试执行这些操作,程序将抛出UnsupportedOperationException。
jshell> Map<String, String> immutableMap =Map.of("Key1", "Jon", "Key2", "Steve", "Key3", "Mia", "Key4", "Lora")immutableMap ==> {Key3=Mia, Key4=Lora, Key1=Jon, Key2=Steve}jshell> immutableMap.put("Key5", "Chaitanya");| java.lang.UnsupportedOperationException thrown:| at ImmutableCollections.uoe (ImmutableCollections.java:71)| at ImmutableCollections$AbstractImmutableMap.put(ImmutableCollections.java:558)| at (#2:1)
- 他们不允许
null元素。添加null元素会抛出相同的UnsupportedOperationException。
