gpt4 book ai didi

java - ConcurrentMap.compute 用作删除

转载 作者:搜寻专家 更新时间:2023-11-01 03:20:45 32 4
gpt4 key购买 nike

使用 Java 8,我在 java.util.concurrent.ConcurrentMap 上实现了一个包装器接口(interface),特别是 remove(Object key)方法。由于我需要在删除期间进行更多检查,因此我需要使用

实现功能

compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

但是,这里的问题是:我必须接受 Object但将其传递给 compute作为K .使用泛型,我什至不能像 if (key instanceof K) ... 这样的运行时检查

我明白为什么 compute 的签名是这样选择的;如果它只是 Object ,如果计算需要创建一个新条目,它不能简单地使用 key 。但我不确定如何解决这个问题 - 是否有任何推荐的模式但使用如下多次调用?

for (;;) {
V v = map.get();
if (check(k, v)) {
if (map.remove(k, v)) return true;
} else return false;
}

谢谢

最佳答案

查看 ConcurrentMap.compute 的默认实现,假设您的 remappingFunction 可以处理 Object,您似乎可以安全地使用未经检查的强制转换不是 K 类型并返回 null。所以你可以使用:

public V remove(Object key) {
@SuppressWarnings("unchecked")
V result = compute((K)key, (k, v) -> {
if(v == null) return null;
...
});
...
}

compute 实现首先使用 get(key)(它接受任何对象,因此它是安全的),并将结果传递给 remappingFunction。如果键的类型无效,则结果将为 null,因此您的 remappingFunction 也应返回 null。在这种情况下,containsKey(key) 将被调用,它也接受任何对象并将返回 false 作为无效对象,compute 将返回

请注意 ConcurretMap.compute 的行为有据可查(甚至提供了等效代码),因此这种实现不太可能在未来中断。

关于java - ConcurrentMap.compute 用作删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31180944/

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