- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不明白为什么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 。我想到的原因:
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/
我想链接 BiFunctions,就像下面代码示例中的方法 chainWanted 一样。 BiFunction 将 Function 作为 AndThen 的参数。是否有可能以某种方式链接 BiFu
我遇到了以下问题:一个方法应该接受一个带有 2 个参数的双函数 - 一个是类型 Collection另一个是T ;实际功能实际上可能是 Collection::remove或 Collection::
我有一张 map ,我想在其中数数。在 Java 8 之前,我必须在映射中为每个键放置一个零,然后才能像 map.put(key, map.get(key)+1). 从 Java 8 开始,我现在可以
这个(大大简化的)代码无法为我编译。不知道为什么。返回类型为 Entry?和 null对我来说似乎是一个有效的值(value)。 val foo = BiFunction, Entry?> { foo
我想编写一个接收 List l 的通用方法和两个 BiFunction f1, f2并返回以下表达式的结果: (a0 + a1) * (a2 + a3) *...*(a_{n-1} + an) * a
这个问题已经有答案了: Why doesn't Java 8's ToIntFunction extend Function (2 个回答) 已关闭 4 年前。 我想知道为什么ToDoubleBiFu
传统的函数式语言在列表的初始值和累加器方面考虑减少。在 Java 中,事情更复杂,因为它需要 BinaryOperator。 我想知道我们是否有更好的方法来编写这种函数: public JsonObj
我一直只使用 Java 6,现在正 catch 学习 Java 8 中的新功能。我在这里阅读了这篇文章: http://www.drdobbs.com/jvm/lambda-expressions-i
我正在尝试从列表中识别其前身大于其值的数字。 在 lambda 表达式中,如果我返回 b,它的行为符合预期,但如果我返回 a,它会给出错误的输出。 这两个返回语句有什么区别? List lis
在尝试使用方法引用时,遇到了可以将 concat 方法用作 BiFunction 的情况,据我所知,BiFunction apply 方法需要 2 个输入参数并产生一个结果。然而,concat 方法接
我对在 java (util) 函数中将方法引用作为参数传递有疑问。 我有两个功能 Function f1 = (val) -> { Output o = new Output();
这个问题在这里已经有了答案: How to print two lists together using Stream API java 8? (3 个答案) 关闭 7 年前。 我需要知道如何申请
我创建了一个 GenericFunction 类,它实现了 Function 和 BiFunction。但是无法编译。 public class GenericFunction implements
BiFunction 接口(interface)的定义包含一个方法 apply(T t, U u),它接受两个参数。但是,我不明白这个接口(interface)和方法的用途或目的。我们需要这个接口(i
我一直在尝试使用 Java 进行函数式编程。但是,当我在类中使用功能接口(interface)作为一级变量时,编译时无法识别我的变量。 我试图将其设为 main 中的局部变量,但收到了相同的结果。 我
我正在尝试将我的 Java 类转换为 Kotlin。这是Java代码: Observable.just("Stacey") .zipWith(Observable.just(6), (
我不明白为什么Map.compute()和Map.computeIfPresent()拿BiFunction参数以及Map.computeIfAbsent()一个Function : V comput
考虑以下简化的测试用例: import java.util.AbstractList; import java.util.Collection; import java.util.Iterator;
我不明白为什么Map.compute()和 Map.computeIfPresent()拿BiFunction参数以及 Map.computeIfAbsent()一个Function : V comp
在初始化 TreeMap、TreeSet 等集合时,我们可以添加自定义比较器。代码看起来像这样: Map map1 = new TreeMap<>(new Comparator() { pub
我是一名优秀的程序员,十分优秀!