I am trying to understand Multimaps class's index function. If I want to use it like a HashMap then I can just put multiple values against a key and retrieve them with the same key.
But if I want to group the data according to some criteria then Multimaps implementation like this is used.
Now I have a doubt in below declaration of index function.
public static <K,V> ImmutableListMultimap<K,V> index(Iterator<V> values, Function<? super V,K> keyFunction)
If ImmutableListMultimap is to be returned with <K,V> then why does Function have the type declaration of <? super V,K>, which is exactly opposite?
Also how does the anonymous inner class of type Function works as shown in this example? I am not able to understand who calls the apply method defined inside the anonymous inner class Function?
If ImmutableListMultimap is to be returned with <K,V> then why does Function have the type declaration of <? super V,K>, which is exactly opposite?
A Multimap has the two type parameters K for the keys and V for the values. The index method has the parameters Iterator<V> values (obviously for the values) and Function<? super V,K> keyFunction (for generating a key for a value).
That means that the keyFunction has to accept a value (of type V or one of its supertypes, since you can pass any value of type V to a method accepting a supertype of V) and it has to return the key (of type K) for that value. This leads to the type Function<? super V,K>.
Also how does the anonymous inner class of type Function works as shown in this example? I am not able to understand who calls the apply method defined inside the anonymous inner class Function?
If you look at the implementation of the index method (https://github.com/google/guava/blob/v23.0/guava/src/com/google/common/collect/Multimaps.java#L1630), you will see that line 1637 that the index method calls keyFunction.apply(value)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With