【问题标题】:Adding a key with an empty value to Guava Multimap将具有空值的键添加到 Guava Multimap
【发布时间】:2012-07-20 22:48:14
【问题描述】:

我需要向 Guava Multimap 添加一个键,并将一个空集合作为值。我该如何做到这一点?

我试过了:

map.put( "my key", null );

但调用 get() 会返回一个包含一个元素的列表,该元素为空。我通过以下方式解决了这个问题:

map.putAll("my key2", new ArrayList())

但我想知道这是否是一件坏事?我知道 Guava 在删除最后一个值以保持 containsKey() 一致时会自动删除一个键。我最好的选择是什么?

【问题讨论】:

  • 你可以告诉我们为什么你觉得你需要让 Multimap 以非预期的方式运行?
  • 这只是数据的性质。我有一组键,其中一些具有与之关联的值,而另一些则没有。 (实际的键/值来自数据库)。如果这对 Multimap 来说是一个糟糕的用例,那很好,我愿意接受其他解决方案。此代码中的原始 impl 使用 Map> 并且切换到 Multimap 似乎很自然。

标签: guava multimap


【解决方案1】:

Multimap 故意 禁止这种方法,并且您提出的解决方法是无操作的——它实际上不会做任何事情。

Multimap 的工作方式是multimap.get(key) 从不返回 null,但总是返回一些集合——可能为空。 (但是支持 Multimap 的实现可能实际上并没有为该键存储任何内容,如果一个键没有映射到 nonempty 集合,它就不会例如出现在 keySet() .Multimap is not a Map<K, Collection<V>>.)

如果要映射到空集合,必须使用Map<K, List<V>>

【讨论】:

    【解决方案2】:

    正如javadoc 所述,多重映射在概念上是一组键值对,其中键不一定是唯一的,例如 a=1、a=2、b=3。如果没有与 a 关联的值,则 a 没有键值对,因此 multimap 中不存在 a。

    您可以做的一件事是为您关心的整个密钥世界保留一个单独的Set<K>,或者只保留不对应任何值的其他密钥。另一种方法是使用Map<K, Collection<V>>Map<K, Something>,其中Something 包含一个可能为空也可能不是空的集合。

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2015-04-30
      相关资源
      最近更新 更多