Reading an interesting articles the guys claims that the difference between the two function are:
Both functions aspire to add an element if the specified Key is not already present in Map.
putIfAbsent adds an element with the specified Value whereas computeIfAbsent adds an element with the value computed using the Key. http://www.buggybread.com/2014/10/java-8-difference-between-map.html
And
We’ve seen that putIfAbsent removes the imperative way of having to define the if-statement, but what if fetching the Java articles is really hurting our performance?
To optimise this, we don’t want to fetch the articles until we’re really sure we need them — meaning we need to know if the key is absent before fetching the articles. http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/
I didn't ready understand what are the differences can you please elaborate more on these two functions ?
computeIfAbsent
takes a mapping function, that is called to obtain the value if the key is missingputIfAbsent
takes the value directlyIf the value is expensive to obtain, then putIfAbsent
wastes that if the key already exists.
A common "expensive" value is e.g. new ArrayList<>()
for when you're creating a Map<K, List<V>>
, where creating a new list when the key already exists (which then discards the new list) generates unnecessary garbage.
computeIfAbsent
returns "the current (existing or computed) value associated with the specified key, or null
if the computed value is null
"putIfAbsent
returns "the previous value associated with the specified key, or null
if there was no mapping for the key"So, if the key already exists, they return the same thing, but if the key is missing, computeIfAbsent
returns the computed value, while putIfAbsent
return null.
Both method define "absent" as key missing or existing value is null
, but:
computeIfAbsent
will not put a null
value if the key is
absentputIfAbsent
will put the value if the key is absent, even if the value is null
It makes no difference for future calls to computeIfAbsent
, putIfAbsent
, and get
calls, but it does make a difference to calls like getOrDefault
and containsKey
.