为什么guava Multimap.values()返回一个扁平集合而不是集合集合?

时间:2012-03-28 20:45:30

标签: java collections guava

我非常喜欢google guava库的Multimap类。它是一种地图类型,您可以在其中为键添加多个值,因此它可以有效地从键映射到某种类型的集合。我特别喜欢的是Multimaps.index()函数,该函数接受Iterable和一个关键函数,并返回MultimapIterable的元素组(或索引或​​映射)函数为每个元素返回的值。

我觉得有点奇怪的是Multimap.values()会返回一个扁平集合而不是集合集合?因此,对索引函数进行分组会让我失去一次Ì检索值。我可以通过调用Multimap.asMap()然后调用值()来解决这个问题。

有谁知道为什么Multimap表现得那么有意义?

2 个答案:

答案 0 :(得分:14)

Multimap.asMap().values()不是围绕问题的方式 - 故意Multimap提供两种访问它的方式,获得Collection<Collection<V>> asMap().values()通过Collection<V>获取展开values() Multimap

更一般地说,entries()尝试而不是只是“集合的地图”,而是“将键与多个值相关联的一般方法”。因此除了values()keys()之外,您还会获得asMap()方法。 values视图提供了一种将其视为“集合映射”的方法,但它具有非常不同的语义,并不总是您正在寻找的。

无论如何,asMap().values()方法只是为了填补与{{1}}填充的利基不同的利基。

答案 1 :(得分:6)

  

有谁知道为什么Multimap的行为可能有意义?

Multimap应该被视为普通地图,其中的密钥不需要是唯一的。

Key       Val
 a   ->    1
 b   ->    2
 a   ->    3

Values: {1, 2, 3}