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

新手上路,请多包涵

Map.java 的文档 -

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

但是当我已经可以 使用重载方法 时……

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

… Map.ofEntries 的用途是什么

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

原文由 Mani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

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

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

Map.ofEntries

返回一个不可变映射,其中包含从给定 条目 中提取的键和值(计数不受限制)

来自 _JEP-269:集合的便利工厂方法_:

对于更大数量的条目,将提供一个 API,该 API 将在给定 任意数量的键值对的 情况下创建一个 Map 实例:

>  Map.ofEntries(Map.Entry<K,V>...)
>
> ```
>
> 虽然这种方法类似于 List 和 Set 的等价可变参数 API,但不幸的是它需要装箱每个键值对。一种适合静态导入的键和值装箱方法,将使这更方便:
>
> ```
>  Map.Entry<K,V> entry(K k, V v)
>
> ```

* * *

您对来自 Map 的方法 `.of()` 的假设有些不正确,可能是因为虽然这将使用 Java9 进行编译:

List values = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // note 11 elements here

Set keys = Set.of(“z”, “o”, “tw”, “th”, “fo”, “fi”, “si”, “se”, “e”, “n”, “te”);


另一方面,这不会:

Map 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`](https://docs.oracle.com/javase/9/docs/api/java/util/List.html#of-E...-)** 和 **[`Set.of`](https://docs.oracle.com/javase/9/docs/api/java/util/Set.html#of-E...-)** 有一个 [可变参数](https://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) 实现,但是要为 `Map` 创建一个类似的 API 应该是键和值--也按照 JEP 中的说明装箱。因此,使用类型为 **[`Map.entry()`](https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#entry-K-V-)** 的可变参数创建了同样的内容:

Map 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 实例具有以下特征:

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

  • 它们是不可变的。对返回的条目调用 Entry.setValue() 会导致 UnsupportedOperationException。

  • 它们不可序列化。

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

类似于最近介绍的 Immutable Map Static Factory Methods 的特性。

原文由 Naman 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Sachin Thapa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题