[英]Why does Map.compute() take a BiFunction
我不明白為什么Map.compute()
和Map.computeIfPresent()
采用BiFunction
參數以及Map.computeIfAbsent()
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 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)
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>
Function<? super V, ? extends V>
Function<? super V, ? extends V>
,將舊值映射到新值,resp。 Supplier<? extends V>
Supplier<? extends V>
為新值。 調用者已經擁有密鑰(第一個參數),因此函數或供應商已經可以使用它。 我找到的所有例子都不使用密鑰。 我想到的原因:
final
- 這很容易管理 但我不相信這些是這種設計的可行原因。 你有什么想法?
您可能computeIfPresent
視為replaceAll
的單條目掛件,而后者需要將鍵作為參數,但支持與兩個操作的輸入相同的功能是很自然的,並且API在此處是一致的 :它始終將鍵作為參數提供給功能。
通常,提供密鑰會提高現有函數的可重用性,無論是方法引用還是BiFunction
接口的普通class
實現(即非lambda)。 但是,考慮到現有的JRE實現,這種可重用性也可能影響lambda表達式的性能:
如此處所述 ,從周圍上下文捕獲值的lambda表達式可能最終出現在每個捕獲過程的單個實例中,而僅使用其參數(非捕獲lambdas)的lambda表達式最終將作為單例實例。 相反,具有否則未使用的參數不會對性能產生影響。 因此,接收密鑰作為參數也是優選的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.