Skip to content

Latest commit

 

History

History
105 lines (70 loc) · 3.74 KB

74.md

File metadata and controls

105 lines (70 loc) · 3.74 KB

Java 9 - 用于创建不可变Map的工厂方法

原文: https://beginnersbook.com/2018/04/java-9-factory-methods-to-create-immutable-map/

在之前的教程中,我们了解了使用 Java 9 中引入的工厂方法创建不可变List不可变Set。在本指南中,我们将学习**如何使用 Java 9 工厂方法创建不可变MapMap.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 中测试一下。

Creating Empty Map before Java 9

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 中测试它。

Java 9 Factory Methods to create immutable Map

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}

什么是不可变的映射?

  1. 不可变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)
  1. 他们不允许null元素。添加null元素会抛出相同的UnsupportedOperationException