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

nan*_*sen 11 java collections guava

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

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

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

Lou*_*man 14

Multimap.asMap().values()不是办法围绕这个问题-这是故意的是Multimap提供两个访问它,得到一个的方式Collection<Collection<V>>通过asMap().values()并获得扁平Collection<V>values().

更广泛地说,Multimap尝试以刚需"的地图收藏",而是"一般的方式与多个值的键关联." 所以你得到的entries()方法除了values()keys().该asMap()视图提供了一种将其视为"集合映射"的方法,但它具有非常不同的语义,并不总是您正在寻找的语义.

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

  • @nansen:这并不像Multimap试图隐藏两个概念重叠(例如,你总是可以遍历`keys()`并执行`get(key)`来获取该键的值集合).理解很简单,如果你要求多图中的所有值,你就不关心相关的键,就像使用法线贴图一样.对于所有其他情况,它为您提供了一个实时视图,可以将其视为"Map <K,Collection <V >>".你意识到`asMap`没有做任何复制,对吧?它只是对相同数据的不同视图,因此开销可以忽略不计. (2认同)

aio*_*obe 6

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

Multimap应被视为普通地图,其中键不需要是唯一的.

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

Values: {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)