2012-07-20 64 views
15

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

我尝试这样做:

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

但调用get()返回一个列表的一个元素,它是空的。我工作围绕这通过执行以下操作:

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

但我不知道如果这是一个糟糕的事是什么?我知道Guava会在删除最后一个值时自动删除一个键,以保持containsKey()的一致性。这里我最好的选择是什么?

+2

您如何告诉我们*为什么*您觉得您需要使Multimap的行为方式不符合预期? – 2012-07-20 22:57:13

+4

这只是数据的性质。我有一套钥匙,其中一些钥匙有与他们相关的价值,还有一些钥匙没有。 (实际的键/值来自数据库)。如果这对于Multimap来说是一个糟糕的用例,那很好,我可以接受其他解决方案。此代码中的原始impl使用了Map >,并且切换到Multimap似乎很自然。 – 2012-07-20 23:13:42

回答

23

Multimap故意禁止这种方法,并且您提议的解决方法是禁用 - 它实际上不会执行任何操作。

Multimap的工作方式是,multimap.get(key)永远不会返回null,但总是返回一些集合 - 可能是空的。 (但后盾Multimap实现可能实际上并不存储任何该键,如果键没有映射到一个非空收集,也不会如出现在keySet()Multimap is not a Map<K, Collection<V>>

如果你想映射到一个空的集合,你必须使用Map<K, List<V>>

8

由于javadoc涵盖,multimap概念上是一串键值对,其中键不一定是唯一的,例如a = 1,a = 2,b = 3。如果没有与a关联的值,那么a没有键 - 值对,所以a在multimap中不存在。

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