【发布时间】:2017-12-27 14:07:06
【问题描述】:
我想了解Multimaps 类的index 函数。如果我想像 HashMap 一样使用它,那么我可以将多个值放在一个键上,然后用同一个键检索它们。
但如果我想根据某些标准对数据进行分组,则使用像 this 这样的 Multimaps 实现。
现在我对下面的索引函数声明有疑问。
public static <K,V> ImmutableListMultimap<K,V> index(Iterator<V> values, Function<? super V,K> keyFunction)
如果 ImmutableListMultimap 要返回 <K,V> 那么为什么 Function 有 <? super V,K> 的类型声明,正好相反?
另外,函数类型的匿名内部类是如何工作的,如this 示例所示?我不明白是谁调用了匿名内部类 Function 中定义的 apply 方法?
【问题讨论】:
-
你知道你可以通过JavaDoc点击到the actual code来亲自看看吗?
-
@PetrJaneček 我确实看过,但发现它足够复杂,可以理解。
-
从外观上看,Guava 是按值而不是键来排序(或索引)的,这就是为什么它们将值传递给
keyFunction,keyFunction将返回它各自的键。基本上它接受一个值列表并为每个值生成一个键。 -
正如 javadoc 所述:用于在多映射中存储该值的键将是对该值调用函数的结果,这意味着从输入迭代器它调用
K key = keyFunction.apply(value);,然后将值存储在带有multimap.put(key, value);的结果Multimap中 -
至于为什么函数有
Function<? super V,K> keyFunction的类型声明:函数必须接受一个值(V)作为参数,并且需要返回键(K)。
标签: java collections guava