18

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

我试过这个:

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

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

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

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

4

2 回答 2

26

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

工作方式Multimapmultimap.get(key)永远不会返回 null,但总是返回一些集合——可能是空的。(但是支持的Multimap实现可能实际上并没有为那个键存储任何东西,如果一个键没有映射到一个非空集合,它就不会出现在keySet(). Multimapis not aMap<K, Collection<V>>中。)

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

于 2012-07-20T23:24:46.807 回答
8

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

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

于 2012-07-21T00:35:15.543 回答