getOrDefault
is suitable if you want to use a stand-in for an absent value without modifying the map. If you want to add a new value for absent keys, you can do it right in one operation.
List<Bar> bars = itemsByFoo.computeIfAbsent(key, x -> new ArrayList<>());
bars.add(someNewBar);
or even
itemsByFoo.computeIfAbsent(key, x -> new ArrayList<>()).add(someNewBar);
In the best case, when being overridden by the Map
implementation, like with HashMap
, this will bear a single hash lookup only.
Not that putIfAbsent
only bears two lookups when using the default
implementation, but, of course, most Map
implementations will provide a single lookup implementation for it. Still, the combination of getOrDefault
and putIfAbsent
would still bear two lookups in the best case, whereas an optimized computeIfAbsent
does only one.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…