我非常喜欢google guava库的Multimap
类。它是一种地图类型,您可以在其中为键添加多个值,因此它可以有效地从键映射到某种类型的集合。我特别喜欢的是Multimaps.index()
函数,该函数接受Iterable
和一个关键函数,并返回Multimap
个Iterable
的元素组(或索引或映射)函数为每个元素返回的值。
我觉得有点奇怪的是Multimap.values()
会返回一个扁平集合而不是集合集合?因此,对索引函数进行分组会让我失去一次Ì检索值。我可以通过调用Multimap.asMap()
然后调用值()来解决这个问题。
有谁知道为什么Multimap
表现得那么有意义?
答案 0 :(得分:14)
Multimap.asMap().values()
不是围绕问题的方式 - 故意Multimap
提供两种访问它的方式,获得Collection<Collection<V>>
asMap().values()
通过Collection<V>
获取展开values()
Multimap
。
更一般地说,entries()
尝试而不是只是“集合的地图”,而是“将键与多个值相关联的一般方法”。因此除了values()
和keys()
之外,您还会获得asMap()
方法。 values
视图提供了一种将其视为“集合映射”的方法,但它具有非常不同的语义,并不总是您正在寻找的。 p>
无论如何,asMap().values()
方法只是为了填补与{{1}}填充的利基不同的利基。
答案 1 :(得分:6)
有谁知道为什么Multimap的行为可能有意义?
Multimap应该被视为普通地图,其中的密钥不需要是唯一的。
Key Val
a -> 1
b -> 2
a -> 3
Values: {1, 2, 3}