你已经链接了Map中的两种工厂方法,它们之间的主要区别是:
返回一个不可变的 Map,其中包含从给定的 entries 中提取的键和值(数量未限定)。For larger numbers of entries, an API will be provided that will create a Map instance given an arbitrary number of key-value pairs:
Map.ofEntries(Map.Entry<K,V>...)
While this approach is analogous to the equivalent varargs APIs for List and Set, it unfortunately requires that each key-value pair be boxed. A method for boxing keys and values, suitable for static import, will make this more convenient:
Map.Entry<K,V> entry(K k, V v)
关于Map中方法.of()
的假设可能有些不正确,这可能是因为在Java9中,尽管这样编译:
List<Integer> values = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // note 11 elements here
Set<String> keys = Set.of("z", "o", "tw", "th", "fo", "fi", "si", "se", "e", "n", "te");
然而,这则不会:
Map<String, Integer> map = Map.of("z", 0, "o", 1,
"tw", 2, "th", 3, "fo", 4, "fi", 5,
"si", 6, "se", 7, "e", 8, "n", 9, "te", 10); // this would not compile
原因是因为对于 List.of
和 Set.of
存在 varargs 实现,但是为了创建一个类似的 API 用于 Map
,键和值都需要像 JEP 中所述一样被装箱。因此,使用类型为 Map.entry()
的 varargs 创建了相同的实现,如下所示:
Map<String, Integer> map = Map.ofEntries(Map.entry("z",0),
Map.entry("o",1),Map.entry("t",2)...so on);
Map.entry()
的介绍,它也是在Since:9引入的 -Map.Entry
。这些条目适用于使用Map.ofEntries()
方法填充Map实例。Entry
实例具有以下特点:Java 9推出了一种简洁的单行代码来创建小型不可修改的集合实例,对于映射,工厂方法的签名如下:
Map.of(key1, value1, key2, value2, key3, value3...)
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3)
该方法被重载以具有0到10个键值对,例如:
Map<String, String> map = Map.of("1", "first");
Map<String, String> map = Map.of("1", "first", "2", "second");
Map<String, String> map = Map.of("1", "first", "2", "second", "3", "third");
同样,您可以拥有最多十个条目。
如果我们有超过10个键值对的情况,有一种不同的方法:
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)
以下是使用方法。
Map<String, String> map = Map.ofEntries(
new AbstractMap.SimpleEntry<>("1", "first"),
new AbstractMap.SimpleEntry<>("2", "second"),
new AbstractMap.SimpleEntry<>("3", "third"));
Map.of()
不是一个可变参数方法。只有10个以下的重载 Map.of()
方法。另一方面,Map.ofEntries()
是一个可变参数方法,因此允许您指定任意数量的条目。Map.ofEntries()
,但由于很多情况下您只需要几个 条目,他们也包括 Map.of()
版本作为方便之举,这样您就不需要将每个键值对包装在 Entry
中。Map.of()
没有可变参数版本? - user5047085K
类型,偶数元素为V
类型。ofEntries
方法解决了这个问题,因为所有元素都是Entry<K, V>
类型(或者更准确地说,是Entry<? extends K, ? extends V>
类型,以允许Entry<K, V>
的子类型)。 - M. Justin
Map.entry(k, v)
而不是new AbstractMap.SimpleEntry<>(k, v)
,尽管(自JDK 9以来也可用)。更为简洁。 - Priidu Neemre