首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是Map.ofEntries()而不是Map.of()

什么是Map.ofEntries()而不是Map.of()
EN

Stack Overflow用户
提问于 2017-10-06 08:54:09
回答 3查看 58.4K关注 0票数 36

Map.java的文档中-

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

但当我已经可以使用过载法 ..。

代码语言:javascript
运行
复制
Map.of("k1","v1","k2","v2","k3","v3"...);

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-06 08:55:32

对于如何创建一个包含26个元素的地图,有任何猜测吗?

您已经链接到的Map中的两个工厂方法的主要区别是:

Map.ofEntries

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

来自http://openjdk.java.net/jeps/269

对于更多的条目,将提供一个API,该API将根据任意数量的键值对()创建一个Map实例: Map.ofEntries(Map.Entry.) 虽然这种方法类似于列表和Set的等效varargs API,但不幸的是,它要求对每个键值对进行装箱。一种用于装箱键和值的方法(适合静态导入)将使这更方便: Map.Entry条目( k,v)

您对Map中的.of()方法的假设有点不正确,可能是因为这将使用Java9编译:

代码语言:javascript
运行
复制
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");

另一方面,这是不会的:

代码语言:javascript
运行
复制
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.ofSet.of,但是为了为Map创建一个类似的API,键和值都应该按照JEP中的说明进行装箱。因此,使用Map.entry()类型的varargs创建了相同的内容,如下所示:

代码语言:javascript
运行
复制
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.setValue()将导致UnsupportedOperationException中的结果。
  • 它们是不可序列化的。
  • 它们是基于价值的。调用者不应假设返回实例的标识。此方法可以自由地创建新实例或重用现有实例。因此,对这些实例(引用相等(==)、身份哈希码和同步)进行身份敏感操作是不可靠的,应该避免。

它们与最近引入的https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#immutable的特性相似。

票数 62
EN

Stack Overflow用户

发布于 2017-10-26 02:38:19

Java 9介绍了使用简洁的一行代码创建不可修改的小集合实例,对于映射,工厂方法的签名如下:

代码语言:javascript
运行
复制
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3)

该方法被重载为0到10个键值对。

代码语言:javascript
运行
复制
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个条目。

对于有超过10个键值对的情况,有一种不同的方法:

代码语言:javascript
运行
复制
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

这是用法。

代码语言:javascript
运行
复制
Map<String, String> map = Map.ofEntries(
  new AbstractMap.SimpleEntry<>("1", "first"),
  new AbstractMap.SimpleEntry<>("2", "second"),
  new AbstractMap.SimpleEntry<>("3", "third"));
票数 13
EN

Stack Overflow用户

发布于 2017-10-06 10:57:58

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

他们本来可以添加Map.ofEntries(),但是由于很多时候您只需要几个条目,所以它们还将Map.of()版本作为方便的方法包括进来,这样就不需要在Entry中包装每个密钥-valur对了。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46601959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档