为什么Map.compute()采用BiFunction

时间:2015-12-09 15:52:56

标签: java dictionary hashmap java-8

我不明白为什么Map.compute()Map.computeIfPresent()采用BiFunction参数以及Map.computeIfAbsent() a Function

V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

我期望一个普通的Function<? super V, ? extends V>,将旧值映射到一个新值,resp。新值Supplier<? extends V>。调用者已经拥有密钥(第一个参数),因此函数或供应商已经可以使用它。我找到的所有例子都不使用密钥。我想到的原因是:

  • 密钥必须(有效)final - 这很容易管理
  • 有一些简单易用的方法参考

但我不相信这些是这种设计的可行原因。你有什么想法吗?

1 个答案:

答案 0 :(得分:10)

您可能会将computeIfPresent视为replaceAll的单项链接,而后者需要键作为参数,但支持与输入相同的功能是很自然的两个操作和API在这里是一致:它总是提供密钥作为函数的参数。

通常,提供密钥会提高现有函数的可重用性,无论是方法引用还是class接口的普通BiFunction实现(即非lambda)。但是,考虑到现有的JRE实现,这种可重用性也可能影响lambda表达式的性能:

As described here,从周围上下文中捕获值的lambda表达式可能会在每个捕获进程的单个实例中结束,而仅使用其参数(非捕获lambdas)的lambda表达式最终将作为单例实例。相反,具有否则未使用的参数不会对性能产生影响。因此,接收密钥作为参数也是可取的。