gpt4 book ai didi

java - Lambda 和 putIfAbsent

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:22 26 4
gpt4 key购买 nike

我发布了一个答案 here其中演示使用 ConcurrentMapputIfAbsent 方法的代码读取:

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;
}

这种方法的主要缺点是您必须创建一个新对象以放入 map 中,无论它是否会被使用。如果物体很重,这会产生重大影响。

我想到这将是一个使用 Lambdas 的机会。我还没有下载 Java 8,或者在它正式发布(公司政策)之前我是否可以下载,所以我无法测试它,但这样的东西是否有效?

public long addTo(String key, long value) {
return map.putIfAbsent( key, () -> new AtomicLong(0) ).addAndGet(value);
}

我希望使用 lambda 来延迟对 new AtomicLong(0) 的评估,直到它实际确定应该创建它,因为它不存在于映射中。

如您所见,这更加简洁和实用。

基本上我想我的问题是:

  1. 这行得通吗?
  2. 还是我完全误解了 lambda?
  3. 有一天这样的事情会奏效吗?

最佳答案

2015-08-01 更新

下面描述的computeIfAbsent方法确实是added to Java SE 8 .语义似乎非常接近预发布版本。

此外,computeIfAbsent 以及一大堆新的默认方法已添加到 Map 接口(interface)中。当然, map 一般不支持原子更新,但新方法为 API 增加了相当大的便利。


您尝试做的事情很合理,但不幸的是它不适用于当前版本的 ConcurrentMap。然而,改进正在进行中。新版本的并发库包括 ConcurrentHashMapV8,其中包含一个新方法 computeIfAbsent。这几乎可以让您完全按照自己的意愿行事。使用这种新方法,您的示例可以重写如下:

public long addTo(String key, long value) {
return map.computeIfAbsent( key, () -> new AtomicLong(0) ).addAndGet(value);
}

有关 ConcurrentHashMapV8 的更多信息,请参阅 Doug Lea 的 initial announcement thread在并发兴趣邮件列表上。线程中的几条消息是a followup message这显示了一个与您正在尝试做的非常相似的示例。 (但是请注意旧的 lambda 语法。毕竟该消息是从 2011 年 8 月开始的。)这里是 recent javadoc对于 ConcurrentHashMapV8

这项工作旨在集成到 Java 8 中,但据我所知还没有。此外,这仍在进行中,名称和规范可能会发生变化等。

关于java - Lambda 和 putIfAbsent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14876967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com