Should I use put() or putIfAbsent() after using getOrDefault()?

后端 未结 2 809
萌比男神i
萌比男神i 2020-12-16 15:52

Java8 introduced those nice methods getOrDefault() and putIfAbsent(), allowing to write code like:

Map>          


        
2条回答
  •  春和景丽
    2020-12-16 16:23

    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 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.

提交回复
热议问题