我想了解Multimaps班级index的功能。如果我想像HashMap一样使用它,那么我可以对一个键放置多个值并使用相同的键检索它们。
但是如果我想根据某些标准对数据进行分组,那么就会使用像this这样的Multimaps实现。
现在我对下面的索引函数声明有疑问。
public static <K,V> ImmutableListMultimap<K,V> index(Iterator<V> values, Function<? super V,K> keyFunction)
如果要使用<K,V>
返回ImmutableListMultimap,那么为什么Function的类型声明为<? super V,K>
,这恰好相反?
同样,类型Function的匿名内部类如何工作,如this示例所示?我无法理解谁调用匿名内部类函数中定义的apply方法?
答案 0 :(得分:1)
如果要使用&lt; K,V&gt;返回ImmutableListMultimap。那么为什么Function的类型声明为&lt;?超级V,K&gt;,这正好相反?
Multimap具有两个类型参数K
用于键,V
用于值。 index
方法的参数Iterator<V> values
(显然是值)和Function<? super V,K> keyFunction
(用于生成值的键)。
这意味着keyFunction
必须接受一个值(类型V
或其某个超类型),因为您可以将任何类型V
的值传递给接受超类型的方法V
)并且必须为该值返回密钥(类型K
)。这会导致类型Function<? super V,K>
。
同样,类型Function的匿名内部类如何工作,如this示例所示?我无法理解谁调用匿名内部类函数中定义的apply方法?
如果您查看index
方法(https://github.com/google/guava/blob/v23.0/guava/src/com/google/common/collect/Multimaps.java#L1630)的实现,您会看到index
方法调用keyFunction.apply(value)