Map.ofEntries() 而不是 Map.of() 有什么用?
从地图的文档.java -
静态工厂方法提供了一种创建不可变映射的便捷方法。
Map.of()
Map.ofEntries()
但是当我已经可以使用重载方法时...
Map.of("k1","v1","k2","v2","k3","v3"...);
...Map.ofEntries的用途是什么,其中还有
返回一个不可变映射,其中包含从给定条目中提取的键和值,并且条目本身不存储在映射中。
从地图的文档.java -
静态工厂方法提供了一种创建不可变映射的便捷方法。
Map.of()
Map.ofEntries()
但是当我已经可以使用重载方法时...
Map.of("k1","v1","k2","v2","k3","v3"...);
...Map.ofEntries的用途是什么,其中还有
返回一个不可变映射,其中包含从给定条目中提取的键和值,并且条目本身不存储在映射中。
您已经链接的 Map 中的两个工厂方法之间的主要区别在于:
返回一个不可变映射,其中包含从给定条目中提取的键和值(在计数中不受限制)
来自 JEP-269:便利工厂收集方法:
对于大量条目,将提供一个 API,该 API 将在给定任意数量的键值对的情况下创建一个 Map 实例:
Map.ofEntries(Map.Entry<K,V>...)
虽然这种方法类似于 List 和 Set 的等效 varargs API,但遗憾的是,它要求对每个键值对都装箱。一种适合静态导入的装箱键和值的方法,将使此操作更加方便:
Map.Entry<K,V> entry(K k, V v)
你对Map中的方法的假设有些不正确,可能是因为虽然这将使用Java9编译:.of()
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,也应该像JEP中所说的那样被装箱。因此,使用Map.entry()
类型的varargs创建了相同的内容,如下所示:Map
Map<String, Integer> map = Map.ofEntries(Map.entry("z",0),
Map.entry("o",1),Map.entry("t",2)...so on);
此外,从其文档也引入了自:9Map.entry()
-
返回包含给定键和值的不可变项。这些条目适用于使用该方法填充 Map 实例。
Map.Entry
Map.ofEntries()
此方法创建的实例具有以下特征:
Entry
它们不允许空键和值。尝试使用空键或值创建它们会导致 NullPointerException。
它们是不可变的。对返回的 Entry.setValue() 的调用会导致“不支持的操作异常”。
它们不可序列化。
它们以价值为基础。调用方不应对返回的实例的标识做出任何假设。此方法可以自由创建新实例或重用现有实例。因此,对这些实例(引用相等 (==)、标识哈希代码和同步)上的标识敏感操作是不可靠的,应避免使用。
它们类似于最近引入的不可变映射静态工厂方法的特征。
Java 9引入了使用简洁的一行代码创建小型不可修改的集合实例,对于映射的工厂方法是:
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"));