簡體   English   中英

為什么Map.compute()采用BiFunction

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM