为什么Map.compute()采用BiFunction

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

V compute(K key, BiFunction remappingFunction) V computeIfPresent(K key, BiFunction remappingFunction) V compute(K key, BiFunction remappingFunction) V computeIfPresent(K key, BiFunction remappingFunction) V computeIfAbsent(K key, Function mappingFunction) V computeIfPresent(K key, BiFunction remappingFunction) V computeIfAbsent(K key, Function mappingFunction)

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

  • 关键必须(有效) final – 这很容易管理
  • 有一些花哨易用的方法参考

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

您可能computeIfPresent视为replaceAll的单条目挂件,而后者需要将键作为参数,但支持与两个操作的输入相同的function是很自然的,并且API在此处是一致的 :它始终将键作为参数提供给function。

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

如此处所述 ,从周围上下文捕获值的lambda表达式可能最终出现在每个捕获过程的单个实例中,而仅使用其参数(非捕获lambdas)的lambda表达式最终将作为单例实例。 相反,具有否则未使用的参数没有性能影响。 因此,接收密钥作为参数也是优选的。