【问题标题】:ImmutableMap.of() workaround for HashMap in Maps?地图中 HashMap 的 ImmutableMap.of() 解决方法?
【发布时间】:2011-08-22 07:35:40
【问题描述】:

有一些实用方法可以创建ImmutableMap,如Immutable.of(Key, value) 及其重载。

但是HashMapLinkedHashMapMaps 类中不存在此类方法。

有没有更好的方法来做到这一点,或者 Guava 假设这样的映射始终是一个常量映射,ImmutableMap 是最好的选择,不需要为HashMap 提供实用程序。

【问题讨论】:

  • Collections.singletonMap
  • 他要求一个可变地图,并支持不止一个条目。
  • @kevin,你的意思是一个只有一个条目的可变映射,到底有什么意义?如果你暗示一个通用的哈希图,你最好用预期的容量来初始化它,而不是仅仅使用一个键值(这对我来说几乎没有意义)

标签: java collections guava


【解决方案1】:

您为什么要那些普通的HashMapLinkedHashMap?你可以这样做:

Map<String, Object> map = Maps.newHashMap();
map.put(key, value);

ImmutableMap 的问题是创建起来有点麻烦;您首先需要创建一个Builder,然后将键值对放入构建器中,然后在其上调用build() 以创建您的ImmutableMap。如果您想使用单个键值对创建ImmutableMapImmutableMap.of() 方法可以缩短编写时间。

考虑一下如果你不使用ImmutableMap.of() 方法你会写什么:

ImmutableMap<String, Object> map = ImmutableMap.builder()
    .put(key, value);
    .build();

【讨论】:

  • @Jasper - 如果我没记错的话支持创建像 Map map = {"key" : 1};将在 java 8 中添加。如果听起来不错,那么为什么不拥有这样的实用程序
  • @Falcon 是的,对集合文字的支持是 Java 8 提出的功能之一。这主要对“固定”地图有用,例如对于您初始化一次的地图和然后永远不要改变内容。但是为了这个目的,如果你使用 Guava,你应该使用 ImmutableMap,而不是常规的可变 HashMap
  • Java 8?:) 我相信它会类似于 Java 7 - 过期和过度承诺:)...
  • @Gabriel Java 7 将于今年夏天(7 月底)发布,但遗憾的是集合文字不会出现在其中……Java 8 计划在 2012 年底推出。
  • ImmutableMap 不支持null 值。
【解决方案2】:

试试Maps.newHashMap(ImmutableMap.of(...))

Maps.newHashMap(Map map)

【讨论】:

  • 我在该页面上看到了两个newHashMap 方法:一个根本不带参数,另一个带Map。您的代码会调用其中哪一个?
  • 好的,Maps.newHashMap(ImmutableMap.of(...)) 写起来很短,但效率不高:你首先创建一个ImmutableMap,然后将其内容复制到一个普通的HashMap,然后抛出临时ImmutableMap离开...
  • 请注意,这也会拒绝 null 键和值。
【解决方案3】:

不同之处在于,对于不可变地图,您必须预先提供所有内容,因为您无法在构建后对其进行更改。对于可变地图,您可以只创建地图然后添加条目。诚然,这使得在单个表达式中创建地图变得稍微困难​​一些,但根据我的经验,这往往不会成为您想要可变地图的问题。

【讨论】:

  • 您可以创建一个可变映射并仅公开非可变接口。 (底层地图仍然是可变的)
  • @bestsss:你可以这样做,是的......但我想说你想要这样做在单个表达式中初始化它的情况相对较少。
  • 当然,但我想这取决于人们假设的单一表达式。一个接受Object[][]或者Object[]的函数,Object[]就可以做到,很多开发者都会称赞它很酷。
  • 如果我没记错的话支持创建像 Map map = {"key" : 1};将在 java 8 中添加。如果听起来不错,那么为什么不拥有这样的实用程序
  • @Falcon,泛型使 java 更难解析/读取(想象一下当你有类名冲突的情况)。您需要通过单个表达式创建地图相对较少(就像 Jon 暗示的那样),它现在是可行的,我认为没有理由“改进”语言。只有配置才是真正可用的场景,我更喜欢将它们保存在 xml 中。
【解决方案4】:

ImmutableMap.of() 返回一个基于哈希的不可变映射,没有顺序。

如果您需要有序的不可变映射,ImmutableSortedMap.of() 是一个选择。

ImmutableSortedMap提供firstKey()lastKey()headMap(K)tailMap(K)等方法;

这两个类都提供copyOf(Map) 方法。

【讨论】:

    【解决方案5】:

    你不能使用ImmutableMap描述的herecopyOf方法吗?

    应该是这样的

    Map newImmutableMap = ImmutableMap.copyOf(yourMap);
    

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 2023-03-23
      • 2012-11-25
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2021-12-20
      • 2011-01-25
      相关资源
      最近更新 更多