为了账号安全,请及时绑定邮箱和手机立即绑定

如何保留 Map.of 工厂中的插入顺序?

如何保留 Map.of 工厂中的插入顺序?

Cats萌萌 2021-09-12 14:34:00
Java 9 提供Map.of()了轻松创建具有固定值的地图的功能。问题:我想创建一个保留插入顺序的映射,例如LinkedHashMap. 那家工厂可以吗?至少map.of()不保留顺序...
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

LinkedHashMap::of确实没有工厂方法,而且 aMap本身没有订单,所以我认为它的唯一方法是构建一个,LinkedHashMap如果你真的需要的话。

顺便说一句,来自JEP 本身

具体集合类(例如,ArrayList、HashSet)上的静态工厂方法已从该提案中删除...

还有一个问题,就是类上的静态方法是由子类继承的。假设要添加一个静态工厂方法 HashMap.of()。由于 LinkedHashMap 是 HashMap 的子类,因此应用程序代码可以调用 LinkedHashMap.of()。这最终会调用 HashMap.of(),这完全不是人们所期望的!

这里的static要点是方法是继承的,但不是可HashMap覆盖的,因此如果将这样的方法添加到它可能不会在LinkedHashMap.

如果可以使用guava,则可以使用ImmutableMap记录为:

一个不可变的、基于哈希的 Map,具有可靠的用户指定的迭代顺序......


查看完整回答
反对 回复 2021-09-12
?
弑天下

TA贡献1818条经验 获得超8个赞

正如Map(重点是我的)的 Java apidoc 中所述:

不可修改的地图

Map.ofMap.ofEntriesMap.copyOf静态工厂方法提供了一种方便的方法来创建不可修改的地图。这些方法创建的 Map 实例具有以下特点:

  • ...

  • 映射迭代顺序未指定并且可能会发生变化。

  • ...

不幸的是,Java API 中没有等效的便捷方法来创建LinkedHashMap. 如果您想要一致的迭代顺序,那么您将需要手动创建LinkedHashMap并填充它(并且 - 如果需要 - 使用 包装它Collections.unmodifiableMap)。

考虑创建您自己的便捷方法,该方法等效于Map.of但具有一致的迭代顺序(或找到已经提供此功能的现有库)。



查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 222 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信