Java8介绍那些好的方法getOrDefault()
和putIfAbsent()
,让写代码,如:我应该在使用getOrDefault()之后使用put()或putIfAbsent()吗?
Map<Foo, List<Bar>> itemsByFoo = ...
List<Bar> bars = itemsByFoo.getOrDefault(key, new ArrayList<>());
bars.add(someNewBar);
现在我如果有好的事实理由要么不知道做:
itemsByFoo.put(key, bars);
或
itemsByFoo.putIfAbsent(key, bars);
两者都可以工作:
- 选项1可能做了很多不必要的“放”呼叫时将元素添加到列表经常发生
- 选项2可能做了很多不必要的“的containsKey”的呼吁时添加新条目,新密钥是主导
SO:是选择1还是选项2“总是”的好理由?
Ahem,*既不*。对于整个操作,使用'itemsByFoo.computeIfAbsent(key,x - > new ArrayList <>()).add(someNeBar);'。 – Holger
@Holger是:)极好的一点。因为'putIfAbsent'可能会返回'null',因为它返回* previous *值...此外'computeifAbsent'存在于java-8中,而不是7个。我之前遇到过这种情况...... – Eugene
@Eugene:'putIfAbsent'被添加到Java 8的'Map'接口中,因为现在可以使用'default'方法,但它必须保留自Java 5以来存在的'ConcurrentMap.putIfAbsent'的协定,所以它不像'computeIfAbsent'那样方便...... – Holger