【发布时间】:2015-12-09 15:52:55
【问题描述】:
我不明白为什么Map.compute() 和Map.computeIfPresent() 带BiFunction 参数以及Map.computeIfAbsent() 和Function:
@987654321@
@987654322@
@987654323@
我希望有一个普通的Function<? super V, ? extends V>,将旧值映射到新值。 Supplier<? extends V> 表示新值。调用者已经拥有密钥(第一个参数),因此函数或供应商已经可以使用它。我发现的所有示例都没有使用密钥。我想到的原因:
- 密钥必须(有效地)
final-- 这很容易管理 - 有一些精美易用的方法参考
但我不认为这些是这种设计的可行理由。你有什么想法吗?
【问题讨论】:
-
在 lambda 中要捕获的变量少了一个。
-
“调用者已经拥有密钥”……除非 BiFunction 是一个方法引用,在这种情况下,该方法将不知道密钥的值,除非该密钥作为参数传入。跨度>
-
@steffen:它可以区分捕获和非捕获,请参阅stackoverflow.com/a/27524543/2711488
-
@VGR,有时拥有关键参数只是不必要的负担。没有它我们可以写
map.computeIfAbsent(key, ArrayList::new).add(value),现在我们需要写map.computeIfAbsent(key, k -> new ArrayList<>()).add(value)引入无用的k。 -
@Tagir Valeev:确实,我不需要钥匙的情况比我需要钥匙的情况更多。但是,在我的项目中,某些函数转换实用程序方法是标准工具集的一部分,因为它们在各个地方都派上用场,即我可以使用
map.computeIfAbsent(key, dropArg(ArrayList::new)). …
标签: java dictionary hashmap java-8