Java8 wprowadzono te ładne metody getOrDefault()
i putIfAbsent()
, pozwalające na pisanie kodu, takich jak:Czy powinienem użyć put() lub putIfAbsent() po użyciu getOrDefault()?
Map<Foo, List<Bar>> itemsByFoo = ...
List<Bar> bars = itemsByFoo.getOrDefault(key, new ArrayList<>());
bars.add(someNewBar);
Teraz zastanawiam się, czy istnieją powody faktyczne albo zrobić:
itemsByFoo.put(key, bars);
lub
itemsByFoo.putIfAbsent(key, bars);
Oba będą działać:
- opcja 1 może zrobić wiele niepotrzebnych „put” połączeń, gdy dodawanie elementów do listy zdarza się często
- opcja2 może zrobić wiele niepotrzebnych „containsKey” wzywa gdy dodawania nowych wpisów do nowych kluczy dominuje
SO: Czy istnieją uzasadnione powody, aby wybrać opcję 1 lub opcję 2 "zawsze"?
Ahem, * ani *. Użyj 'itemsByFoo.computeIfAbsent (key, x -> new ArrayList <>()) .add (someNewBar);' dla całej operacji. – Holger
@ Hger tak :) doskonały punkt. Ponieważ 'putIfAbsent' może zwrócić' null', ponieważ zwraca * poprzednią * wartość ... Również 'computeifAbsent' jest obecne w java-8, nie 7. Zrobiłem to wcześniej ... – Eugene
@Eugene: 'putIfAbsent' został dodany do interfejsu' Map' w Javie 8, ponieważ był teraz możliwy dzięki 'default' metodom, ale musiał zachować kontrakt z' ConcurrentMap.putIfAbsent', który istnieje od wersji Java 5, więc nie jest tak wygodne, jak "computeIfAbsent" ... – Holger