Guava的Multimaps类的索引()函数如何在内部工作?

时间:2017-12-27 14:07:07

标签: java collections guava

我想了解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方法?

1 个答案:

答案 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)

的第1637行