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