![](/img/trans.png)
[英]Map.ofEntries gives Null Pointer Exception on checking NULL key using containsKey()
[英]What is the use of Map.ofEntries() instead of Map.of()
您已经链接的 Map 中的两个工厂方法之间的主要区别在于:
返回包含从给定条目(不受计数限制)中提取的键和值的不可变映射
来自JEP-269:Convenience Factory Methods for Collections :
对于较大数量的条目,将提供一个 API,该 API 将在给定任意数量的键值对的情况下创建一个 Map 实例:
Map.ofEntries(Map.Entry<K,V>...)
虽然这种方法类似于 List 和 Set 的等效可变参数 API,但不幸的是,它需要对每个键值对进行装箱。 一种装箱键和值的方法,适用于静态导入,将使这更方便:
Map.Entry<K,V> entry(K k, V v)
您对 Map 中的 .of .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
有一个可变参数实现,但是要为Map
创建一个类似的 API,键和值也应该按照 JEP 中的说明进行装箱。 因此,使用Map.entry()
类型的可变参数创建了相同的内容:
Map<String, Integer> map = Map.ofEntries(Map.entry("z",0),
Map.entry("o",1),Map.entry("t",2)...so on);
此外,从Map.entry()
的文档中也引入了自:9 -
返回包含给定键和值的不可变
Map.Entry
。 这些条目适用于使用Map.ofEntries()
方法填充 Map 实例。该方法创建的
Entry
实例具有以下特点:
它们不允许空键和值。 尝试使用空键或值创建它们会导致 NullPointerException。
它们是不可变的。 对返回的 Entry 调用 Entry.setValue() 导致 UnsupportedOperationException。
它们不可序列化。
它们是基于价值的。 调用者不应假设返回实例的身份。 此方法可以自由地创建新实例或重用现有实例。 因此,对这些实例的身份敏感操作(引用相等 (==)、身份哈希码和同步)是不可靠的,应该避免。
类似于最近介绍的Immutable Map静态工厂方法的特性。
Java 9 引入了使用简洁的一行代码创建不可修改的小型 Collection 实例,对于映射,工厂方法的签名是:
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.ofEntries()
但由于很多时候你只需要几个条目,他们还包括Map.of()
版本作为便利方法,这样你就不需要将每个键值对包装在里面一个Entry
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.