向Guava Multimap添加一个空值的键

18
我需要在Guava Multimap中添加一个键,其对应的值为空集合。该如何实现?
我尝试了以下代码:
map.put( "my key", null );

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

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

但我想知道这样做是不是不好的做法?我知道Guava会在最后一个值被移除时自动删除相应的键,以保持containsKey()一致。在这种情况下,我的最佳选择是什么?


2
你能告诉我们为什么你觉得需要让Multimap以一种它原本不打算的方式运作吗? - Jon Skeet
5
这只是数据的本质。 我有一组键,其中一些带有与其关联的值,而另外一些则没有(实际的键/值来自数据库)。如果Multimap不适用于此用例,那没关系,我可以考虑其他解决方案。在此代码中,原始实现使用了Map<String,List<String>>,转换为Multimap似乎很自然。 - Ryan Nelson
2个回答

27
Multimap 故意地 禁止这种方法,而您提出的解决方法不起作用--它实际上不会执行任何操作。 Multimap 的工作方式是,multimap.get(key) 永远不会返回 null,但总是返回某个集合--可能为空。(但是支持 Multimap 实现可能实际上并没有为该键存储任何内容,如果一个键未映射到非空集合,则不会例如出现在 keySet() 中。 Multimap 不是 Map<K, Collection<V>>。)
如果要映射到空集合,则必须使用 Map<K, List<V>>

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

您可以使用一个单独的Set<K>来保存您关心的所有键的完整集合,或者只保留对应于没有任何值的附加键。另一种方法是使用 Map<K, Collection<V>>,或者使用包含可能为空的集合的Map<K, Something>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接