興味深い記事を読んでみると、2 つの機能の違いは次の通りだと主張しています。
どちらの関数も、指定されたキーがマップ内にまだ存在しない場合に要素を追加することを目指します。
putIfAbsent は指定された値を持つ要素を追加しますが、computeIfAbsent はキーを使用して計算された値を持つ要素を追加します。http://www.buggybread.com/2014/10/java-8-difference-between-map.html
そして
putIfAbsent によって、if ステートメントを定義するという命令的な方法が削除されることはわかりましたが、Java の記事を取得するとパフォーマンスが本当に低下する場合はどうなるでしょうか。
これを最適化するには、本当に必要だと確信できるまで記事を取得しないようにします。つまり、記事を取得する前にキーが存在しないかどうかを知る必要があるということです。http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/
違いが何なのかよく分かりませんでした。この 2 つの機能について詳しく説明していただけますか?
ベストアンサー1
違いその1
computeIfAbsent
キーが欠落している場合に値を取得するために呼び出されるマッピング関数を取りますputIfAbsent
値を直接取得する
値の取得にコストがかかる場合、putIfAbsent
キーがすでに存在すると、そのコストは無駄になります。
一般的な「高価な」値は、new ArrayList<>()
たとえば を作成する場合ですMap<K, List<V>>
。この場合、キーがすでに存在するときに新しいリストを作成すると (その後新しいリストは破棄されます)、不要なゴミが生成されます。
違いその2
computeIfAbsent
指定されたキーに関連付けられた現在の(既存のまたは計算された)値を返します。null
計算された値がnull
「putIfAbsent
「指定されたキーに関連付けられた以前の値、またはnull
キーにマッピングがなかった場合は」を返します。
したがって、キーがすでに存在する場合は同じものを返しますが、キーが欠落している場合はcomputeIfAbsent
計算された値を返し、putIfAbsent
null を返します。
違い #3
どちらの方法でも、キーが欠落しているか、既存の値が である場合に「不在」と定義されますnull
が、次のようになります。
computeIfAbsent
null
キーが存在しない場合は値を設定しませんputIfAbsent
キーが存在しない場合は、値が存在する場合でも値を設定します。null
今後の電話には影響ありませんcomputeIfAbsent
、putIfAbsent
、 そしてget
通話では違いがありますが、次のような通話では違いがありますgetOrDefault
そしてcontainsKey
。