企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Java 9 - 用于创建不可变`Map`的工厂方法 > 原文: [https://beginnersbook.com/2018/04/java-9-factory-methods-to-create-immutable-map/](https://beginnersbook.com/2018/04/java-9-factory-methods-to-create-immutable-map/) 在之前的教程中,我们了解了使用 Java 9 中引入的**工厂方法**创建[不可变`List`](https://beginnersbook.com/2018/04/java-9-factory-method-to-create-immutable-list/)和[不可变`Set`](https://beginnersbook.com/2018/04/java-9-factory-methods-to-create-immutable-set/)。在本指南中,我们将学习**如何使用 Java 9 工厂方法创建不可变`Map`和`Map.Entry`。 ## 1.在 Java 9 之前创建不可变`Map` 在我们看到如何使用 Java 9 工厂方法创建不可变`Map`之前,让我们看看我们在 Java 9 之前如何创建它们。 ### 1.1 在 Java 9 之前创建空映射 我们曾经使用[`Collections`](https://beginnersbook.com/java-collections-tutorials/)类的`unmodifiableMap()`方法来创建不可修改的(不可变的)`Map`。 ```java Map<String,String> map = new HashMap<String, String>(); Map<String,String> immutableMap = Collections.unmodifiableMap(map); ``` 让我们在 [JShell](https://beginnersbook.com/2018/04/java-9-jshell-repl/) 中测试一下。 ![Creating Empty Map before Java 9](https://img.kancloud.cn/ca/2b/ca2b47eacce4411d4082ba7d87a0f01a_1024x501.jpg) ### 1.2 在 Java 9 之前创建非空映射 ```java 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 中测试它。 ![Java 9 Factory Methods to create immutable Map](https://img.kancloud.cn/84/d3/84d394343c44f726fa6fe89632ec06d4_1024x697.jpg) ## 2\. Java 9 工厂方法创建不可变`Map` Java 9 中引入了几种有用的工厂方法来创建不可修改的`Map`。我们将采用与上面相同的示例来比较 Java 9 中的事情变得更容易。在 Java 9 之前编写的代码行在工厂方法的帮助下大大减少了。 ### 2.1 Java 9 - 使用`Map.of()`工厂方法的不可变空映射 **我们用于空映射的方法:** ```java static <K,V> Map<K,V> of() ``` **示例:** ```java Map<String,String> immutableMap = Map.of() ``` **在 JShell 中测试:** ```java jshell> Map<String,String> immutableMap = Map.of() immutableMap ==> {} ``` ### 2.2 Java 9 - 使用`Map.of(Key, Value ...)`工厂方法创建不可变非空映射 ```java static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2...) ``` **示例:** 为了演示使用`Map.of()`工厂方法,我们采用了与上面使用`unmodifiableMap()`方法相同的示例。正如您所看到的,它在 Java 9 中是多么简单。我们在一行中减少了 6 行代码。 ```java Map<String, String> immutableMap = Map.of("Key1", "Jon", "Key2", "Steve", "Key3", "Mia", "Key4", "Lora") ``` **在 JShell 中测试:** ```java jshell> Map<String, String> immutableMap = Map.of("Key1", "Jon", "Key2", "Steve", "Key3", "Mia", "Key4", "Lora") immutableMap ==> {Key3=Mia, Key4=Lora, Key1=Jon, Key2=Steve} ``` ## 什么是不可变的映射? 1. 不可变`Map`不允许添加,删除和更新其元素。如果您尝试执行这些操作,程序将抛出`UnsupportedOperationException`。 ```java 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) ``` 2. 他们不允许`null`元素。添加`null`元素会抛出相同的`UnsupportedOperationException`。