gpt4 book ai didi

java - 为什么 Map.compute() 采用 BiFunction

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:22 25 4
gpt4 key购买 nike

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

<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#compute-K-java.util.function.BiFunction-" rel="noreferrer noopener nofollow"><code>V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)</code></a>
<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfPresent-K-java.util.function.BiFunction-" rel="noreferrer noopener nofollow"><code>V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)</code></a>
<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-" rel="noreferrer noopener nofollow"><code>V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)</code></a>

我期望一个普通的 Function<? super V, ? extends V> ,分别将旧值映射到新值。一个 Supplier<? extends V> 为新的值(value)。调用者已经拥有 key (第一个参数),因此函数或供应商已经可以使用它。我发现的所有示例都不使用该 key 。我想到的原因:

  • key 必须(有效)final -- 易于管理
  • 有一些精美且易于使用的方法引用

但我不认为这些是这种设计的可行理由。你有什么想法吗?

最佳答案

您可能会看到computeIfPresent作为 replaceAll 的单入口吊坠而后者需要 key 作为参数,但很自然地支持相同的函数作为两个操作的输入,并且 API 在这里一致:它始终提供 key 作为函数的参数。

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

As described here ,从周围上下文捕获值的 lambda 表达式可能最终会出现在每个捕获进程的单独实例中,而仅使用其参数(非捕获 lambda)的 lambda 表达式最终将成为单例实例。相反,拥有其他未使用的参数不会对性能产生影响。因此,出于这个原因,接收 key 作为参数也是更好的选择。

关于java - 为什么 Map.compute() 采用 BiFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40874228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com