ho postato una risposta here in cui il codice che dimostra l'uso del metodo di ConcurrentMap
putIfAbsent
leggere:lambda e 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;
}
Lo svantaggio principale di questo approccio è che si deve creare un nuovo oggetto da mettere in mappa se sarà usato o meno. Questo può avere un effetto significativo se l'oggetto è pesante.
Mi è venuto in mente che questa sarebbe stata l'occasione per usare Lambdas. Non ho scaricato Java 8 e non sarò in grado di farlo fino a quando non sarà ufficiale (politica aziendale), quindi non posso testarlo, ma una cosa del genere sarebbe valida ed efficace?
public long addTo(String key, long value) {
return map.putIfAbsent(key,() -> new AtomicLong(0)).addAndGet(value);
}
spero di usare la lambda per ritardare la valutazione del new AtomicLong(0)
fino a quando non è in realtà determinata che dovrebbe essere creato perché non esiste nella mappa.
Come potete vedere, questo è molto più succinto e funzionale.
Essenzialmente suppongo le mie domande sono:
- Sarà questo lavoro?
- Oppure ho interpretato erroneamente lambda?
- Potrebbe qualcosa del genere questo lavoro un giorno?
In che modo non è possibile scaricare Java 8 e testarlo da soli? La tua azienda ti impedisce di installare nulla (anche a scopo di valutazione) sul tuo computer di lavoro? Che ne dici di provarlo su quello personale allora? –
@SimonLehmann - BTW - Dopo il tuo commento ho installato Java 8 e non solo non ha Lambdas (c'era un extra che dovevo installare ma non ci sono riuscito) ma DBVisualiser ha smesso di funzionare - quindi l'ho rimosso. Scusate. Forse l'anno prossimo. – OldCurmudgeon