Zamieściłem odpowiedź here gdzie kod wykazanie wykorzystania metody ConcurrentMap
putIfAbsent
przeczytać:lambdas i putIfAbsent
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;
}
Główną wadą tego podejścia jest to, że trzeba stworzyć nowy obiekt, aby umieścić w mapa, czy będzie używana, czy nie. Może to mieć znaczący wpływ, jeśli obiekt jest ciężki.
Przyszło mi do głowy, że będzie to okazja do skorzystania z Lambdas. Nie pobrałem Java 8 lub czy będę w stanie, dopóki nie będzie ona oficjalna (polityka firmy), więc nie mogę tego przetestować, ale czy coś takiego będzie ważne i skuteczne?
public long addTo(String key, long value) {
return map.putIfAbsent(key,() -> new AtomicLong(0)).addAndGet(value);
}
Mam nadzieję, że do korzystania z lambda opóźnić ocenę new AtomicLong(0)
dopóki nie zostanie ustalone, że rzeczywiście powinien zostać utworzony, ponieważ nie istnieje na mapie.
Jak widać, jest to bardziej zwięzłe i funkcjonalne.
Zasadniczo przypuszczam moje pytania są następujące:
- Będzie to działać?
- Czy też całkowicie błędnie zinterpretowałem lambdas?
- Może kiedyś coś takiego się stanie?
W jaki sposób nie można pobrać Java 8 i przetestować jej samodzielnie? Czy twoja firma uniemożliwia ci zainstalowanie czegokolwiek (nawet do celów oceny) na twoim komputerze? A może wypróbujesz to na swojej osobistej? –
@SimonLehmann - BTW - Po twoim komentarzu zainstalowałem Java 8 i nie tylko nie miał Lambdas (był dodatkowy, który miałem zainstalować, ale nie udało mi się tego obejść), ale DBVisualiser przestał działać - więc usunąłem go. Przepraszam. Być może w przyszłym roku. – OldCurmudgeon