【问题标题】:How Guava's Multimaps class's index() function works internally?Guava 的 Multimaps 类的 index() 函数如何在内部工作?
【发布时间】: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 要返回 &lt;K,V&gt; 那么为什么 Function 有 &lt;? super V,K&gt; 的类型声明,正好相反?

另外,函数类型的匿名内部类是如何工作的,如this 示例所示?我不明白是谁调用了匿名内部类 Function 中定义的 apply 方法?

【问题讨论】:

  • 你知道你可以通过JavaDoc点击到the actual code来亲自看看吗?
  • @PetrJaneček 我确实看过,但发现它足够复杂,可以理解。
  • 从外观上看,Guava 是按值而不是键来排序(或索引)的,这就是为什么它们将值传递给keyFunctionkeyFunction 将返回它各自的键。基本上它接受一个值列表并为每个值生成一个键。
  • 正如 javadoc 所述:用于在多映射中存储该值的键将是对该值调用函数的结果,这意味着从输入迭代器它调用K key = keyFunction.apply(value);,然后将值存储在带有multimap.put(key, value);的结果Multimap中
  • 至于为什么函数有Function&lt;? super V,K&gt; keyFunction的类型声明:函数必须接受一个值(V)作为参数,并且需要返回键(K)。

标签: java collections guava


【解决方案1】:

如果 ImmutableListMultimap 要与 一起返回,那么为什么 Function 有 ,正好相反?

Multimap 有两个类型参数K 用于键和V 用于值。 index 方法具有参数Iterator&lt;V&gt; values(显然是用于值)和Function&lt;? super V,K&gt; keyFunction(用于为值生成键)。

这意味着keyFunction 必须接受一个值(V 类型或其超类型之一,因为您可以将V 类型的任何值传递给接受超类型V 的方法)和它必须返回该值的键(K 类型)。这导致类型为Function&lt;? super V,K&gt;

另外,函数类型的匿名内部类是如何工作的,如this 示例所示?我不明白是谁调用了匿名内部类 Function 中定义的 apply 方法?

如果您查看index 方法(https://github.com/google/guava/blob/v23.0/guava/src/com/google/common/collect/Multimaps.java#L1630)的实现,您将看到index 方法调用keyFunction.apply(value) 的第1637 行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2013-02-13
    • 2018-03-07
    • 2015-11-25
    • 2019-02-01
    • 2022-12-29
    • 2020-11-29
    相关资源
    最近更新 更多