有什么用Map.ofEntries()而不是Map.of()

时间:2017-10-06 08:54:09

标签: java hashmap java-9

来自Map.java -

的文档
  

Map.of()Map.ofEntries()静态工厂方法提供了一种创建不可变映射的便捷方法。

但是当我已经可以use overloaded method ...

Map.of("k1","v1","k2","v2","k3","v3"...);

...... Map.ofEntries的用途是什么?

  

返回一个不可变的映射,其中包含从给定条目中提取的键和值,并且条目本身不会存储在映射中。

3 个答案:

答案 0 :(得分:17)

有关如何创建26个元素的地图的任何猜测?

您已链接的Map中两个工厂方法的主要区别在于:

<强> Map.ofEntries

  

返回包含从中提取的键和值的不可变映射   给出条目(数量不受限制)

来自 JEP-269:Convenience Factory Methods for Collections

  

对于大量条目,将提供API   给定任意数量的键值对

,创建一个Map实例
Map.ofEntries(Map.Entry<K,V>...)
     

虽然这种方法类似于等效的varargs API   列表和设置,遗憾的是要求每个键值对   盒装。用于装箱键和值的方法,适用于静态   导入,将使这更方便:

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

之所以这样,是因为 varargs List.of Set.of实施,但要创建类似的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()的文档,其中也介绍了自:9 -

  

返回包含给定键和值的不可变Map.Entry。   这些条目适合使用。填充Map实例   Map.ofEntries()方法。

     

此方法创建的Entry个实例   具有以下特点:

     
      
  • 它们不允许使用null键和值。尝试使用null键或值创建它们会导致NullPointerException。

  •   
  • 它们是不可变的。在UnsupportedOperationException中对返回的Entry结果调用Entry.setValue()。

  •   
  • 它们不可序列化。

  •   
  • 它们是基于价值的。调用者不应对返回实例的身份做出任何假设。这种方法可以自由创建新的   实例或重用现有实例。因此,身份敏感   对这些实例的操作(引用相等(==),标识哈希   代码和同步)是不可靠的,应该避免。

  •   

与最近推出的 Immutable Map Static Factory Methods 的特征类似。

答案 1 :(得分:4)

嗯,这很简单。 Map.of()不是varargs方法。最多只有10个条目的重载Map.of()。另一方面,Map.ofEntries()是一种varargs方法,因此允许您根据需要指定任意数量的条目。

他们可能刚刚添加了Map.ofEntries(),但由于很多时候你只需要几个条目,它们还包括Map.of()版本作为便利方法,因此你不需要包装每个密钥 - Entry内的一对。

答案 2 :(得分:3)

Java 9引入了使用简洁的一行代码创建小的不可修改的Collection实例,对于map,工厂方法的签名是:

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"));