Java SE 9:不可变Map和Map.Entry的工厂方法

时间:2020-02-23 14:37:02  来源:igfitidea点击:

在本文中,我们将讨论一些Java SE 9新功能:"不可变Map和Map.Entry的工厂方法",并提供一些简单而合适的示例。

注意:-不可变列表,集合和映射的所有Java SE 9工厂方法都是静态实用程序方法。

Java SE 8:不可变的空映射

现在,我们将看到如何在Java SE 8和更早版本中创建Empty Immutable Map。
如果要创建一个空的不可变或者不可修改的地图,则应使用Collections类实用程序方法:unmodifiableMap,如下所示:

空地图示例:

Map<Integer,String> emptyMap = new HashMap<>();
 Map<Integer,String> immutableEmptyMap = Collections.unmodifiableMap(emptyMap);

使用Java SE 9 REPL测试以下代码:

jshell> Map<Integer,String> emptyMap = new HashMap<>()
emptyMap ==> {}

jshell> Map<Integer,String> immutableEmptyMap = Collections.unmodifiableMap(emptyMap)
immutableEmptyMap ==> {}

其中我们可以观察到要创建一个空的不可变映射,我们需要做很多事情以及非常繁琐和冗长的步骤。
现在让我们在Java SE 9中看到同样的事情。

Java SE 9:具有Map.of()的不可变空映射

为了克服这些缺点,Java SE 9引入了两组有用的重载方法。

  • Map.of()
  • Map.ofEntries()

在本节中,我们将讨论第一套方法,即Map.of()实用程序方法,并在下一节中介绍下一套方法。

如果通过Java SE 9 Map API,我们可以在Map界面中找到以下实用程序方法。
空Map API实用程序

static <K,V> Map<K,V> of()

此实用程序方法用于创建一个空的不可变映射,该映射是Java SE 9中零元素的Map。

空地图示例:

jshell> Map<Integer,String> emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

在这里我们可以看到,在Java SE 9中创建一个空的不可变映射是非常简单的过程。

Java SE 8:不可变的非空映射

在本部分中,我们将看到如何在Java SE 8和早期版本中创建非空的不可变映射。

我们可以使用相同的Collections.unmodifiableMap实用程序方法来创建非空的不可变地图,如下所示。

非空地图示例:

Map<Integer,String> nonemptyMap = new HashMap<>();
 nonemptyMap.put(1,"one")
 nonemptyMap.put(2,"two")
 nonemptyMap.put(3,"three")
 Map<Integer,String> immutableNonEmptyMap = Collections.unmodifiableMap(nonemptyMap);

其中我们还可以观察到,要创建一个非空的不可变映射,我们需要做很多事情以及非常繁琐和冗长的步骤。
现在让我们在Java SE 9中看到同样的事情。

使用Java SE 9 REPL进行测试:

jshell> Map<Integer,String> nonemptyMap = new HashMap<>()
nonemptyMap ==> {}

jshell> nonemptyMap.put(1,"one")
 ==> null

jshell> nonemptyMap.put(2,"two")
 ==> null

jshell> nonemptyMap.put(3,"three")
 ==> null

onemptyMap)<Integer,String> immutableNonEmptyMap = Collections.unmodifiableMap(n
immutableNonEmptyMap ==> {1=one, 2=two, 3=three}

jshell> nonemptyMap
nonemptyMap ==> {1=one, 2=two, 3=three}

Java SE 9:具有Map.of()的不可变非空映射

在本节中,我们将讨论如何使用Java SE 9 of()重载方法来创建不可变的非空映射。
如果我们浏览Java SE 9 API文档,我们将在Map界面中看到以下实用程序方法。

非空Map API实用程序

static <K,V> Map<K,V> of(K k1, V v1)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9)
 static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10)

这些有用的方法用于创建一个新的非空不可变映射,该映射具有一个元素到10个元素。

非空Map API实用程序

static <K,V> Map<K,V> of(K k1, V v1)

非空地图示例:

jshell> Map<Integer,String> nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}

在这里我们可以看到,在Java SE 9中创建一个空的和非空的不可变映射非常容易。

Java SE 9:不可变的Map.ofEntries()实用程序

众所周知,Java SE 9引入了两组Map Utility方法来创建不可变的Map:of和ofEntries。
在前面的部分中,我们已经讨论过Map.of()方法。
在本节中,我们将讨论"如何使用Map.ofEntries()方法"来创建空或者非空Maps。

Map.ofEntries()方法用于使用条目创建不可变或者不可修改的地图。

如果通过Java SE 9 Map API,我们可以在Map界面中找到以下实用程序方法。
空Map API实用程序

static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

此var-args方法对于使用Entries创建具有零个或者一个或者多个元素的不可变映射很有用。
我们应该使用Map.entry()实用程序方法创建条目。
请参阅下一节以了解此Map.entry()方法。

空地图示例:

jshell> Map<Integer,String> emptyImmutableMap = Map.ofEntries()
emptyImmutableMap ==> {}

此有用的方法用于使用Entries创建一个零元素的新不可变地图。

非空地图示例:

import static java.util.Map.entry
jshell> Map<Integer,String> emptyImmutableMap = Map.ofEntries(entry(1,"one"),
 ...> entry(2,"two"), entry(3,"three"))
emptyImmutableMap ==> {1=one, 2=two, 3=three}

这种有用的方法用于使用条目使用一个或者多个元素创建新的不可变地图。

Java SE 9:不可变的Map.entry()实用程序

如前一节所述,我们可以使用此Map.entry()实用程序方法使用给定的键和值对创建不可变的Map.Entry。
如上例所示,它用作Map.ofEntries()方法的一部分来创建不可变地图。

Map.entry()方法API:

static <K,V> Map.Entry<K,V> entry(K k, V v)

Map.entry()方法示例:

jshell> Map.Entry<Integer,String> immutableMapEntry1 = Map.entry(1,"one")
immutableMapEntry1 ==> 1=one

jshell> Map.Entry<Integer,String> immutableMapEntry2 = Map.entry(2,"two")
immutableMapEntry2 ==> 2=two

jshell> Map.Entry<Integer,String> immutableMapEntry3 = Map.entry(3,"three")
immutableMapEntry3 ==> 3=three

其中我们创建了三个Immutable Map.Entry对象。
使用这些Entry对象,我们可以创建一个不可变映射,如下所示:

jshell> Map<Integer,String> immutableMap = Map.ofEntries(immutableMapEntry1,
 ...> immutableMapEntry2, immutableMapEntry3)
immutableMap ==> {3=three, 2=two, 1=one}

注意:-不可变映射的特征类似于不可变列表。