我張貼解答here,其中展示了使用ConcurrentMap
的putIfAbsent
方法的代碼如下:lambda表達式和的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;
}
這種方法的主要缺點是,你必須創建一個新的對象裝進映射它是否會被使用。如果物體很重,這可能會產生重大影響。
我突然想到,這將是使用Lambda表達式的機會。我沒有下載Java 8 n'or我將能夠,直到它是正式的(公司政策),所以我不能測試這個,但這樣的事情是有效的和有效的?
public long addTo(String key, long value) {
return map.putIfAbsent(key,() -> new AtomicLong(0)).addAndGet(value);
}
我希望能使用拉姆達延遲new AtomicLong(0)
的評價,直到它實際上是決定了它應建立,因爲它沒有在地圖上存在。
正如你可以看到這是更簡潔和實用。
從本質上講,我想我的問題是:
- 將這項工作?
- 還是我完全曲解lambda表達式?
- 這樣的工作有一天可能會奏效嗎?
你怎麼無法下載Java 8並自行測試?您的公司是否阻止您在工作計算機上安裝任何東西(甚至用於評估目的)?那麼在你的個人身上嘗試一下呢? – 2013-02-14 14:31:13
@SimonLehmann - 順便說一句 - 在您發表評論後,我安裝了Java 8,它不僅沒有Lambdas(還有一些額外的東西我應該安裝,但沒有解決),但DBVisualiser停止工作 - 所以我刪除了它。抱歉。也許明年。 – OldCurmudgeon 2013-03-02 00:25:29