Я разместил ответ здесь, где код, демонстрирующий использование метода putIfAbsent
метода ConcurrentMap
, гласил:
ConcurrentMap<String, AtomicLong> map = new ConcurrentHashMap<String, AtomicLong> ();
public long addTo(String key, long value) {
// The final value it became.
long result = value;
// Make a new one to put in the map.
AtomicLong newValue = new AtomicLong(value);
// Insert my new one or get me the old one.
AtomicLong oldValue = map.putIfAbsent(key, newValue);
// Was it already there? Note the deliberate use of '!='.
if ( oldValue != newValue ) {
// Update it.
result = oldValue.addAndGet(value);
}
return result;
}
Основным недостатком этого подхода является то, что вам нужно создать новый объект, чтобы поместить его на карту, независимо от того, будет он использоваться или нет. Это может иметь значительный эффект, если объект тяжелый.
Мне пришло в голову, что это будет возможность использовать Lambdas. Я не загрузил Java 8 и смогу ли я это сделать, пока она не станет официальной (политика компании), поэтому я не могу проверить это, но будет ли что-то подобное действительно и эффективно?
public long addTo(String key, long value) {
return map.putIfAbsent( key, () -> new AtomicLong(0) ).addAndGet(value);
}
Я надеюсь использовать лямбду, чтобы отложить оценку new AtomicLong(0)
до тех пор, пока не будет определено, что его следует создать, потому что он не существует на карте.
Как видите, это намного лаконичнее и функциональнее.
По сути, я полагаю, что мои вопросы:
- Будет ли это работать?
- Или я полностью неправильно истолковал лямбды?
- Может ли что-то подобное работать в один прекрасный день?