- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 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/
ConcurrentMap 的 JavaDoc - putIfAbsent 说: /** * If the specified key is not already associated
我有这个 ConcurrentMap ConcurrentMap companyLogo = new MapMaker() .concurrencyLevel(
我该如何实现 class CaseInsensitiveConcurrentMap implements ConcurrentMap 就像ConcurrentHashMap 一样工作除了不区分大小写地
根据ConcurrentMap Javadoc : Memory consistency effects: As with other concurrent collections, actions
我有一段代码可以由多个线程执行,该代码需要执行 I/O 绑定(bind)操作,以便初始化存储在 ConcurrentMap 中的共享资源。我需要使这段代码线程安全,并避免不必要的调用来初始化共享资源。
我有一个 ConcurrentHashMap 累积了一些应该定期发送到某处的更改(用于某种复制)。关于更改,只有任何关键事项的最新值。 所以我需要获取并删除一些快照。快照不需要是原子的,只要它的每个条
ConcurrentMap 指定putIfAbsent() 的返回值为: the previous value associated with the specified key, or null i
我有一个有趣的问题需要帮助。我已经为两个不同的条件实现了几个队列,一个基于 FIFO,另一个基于键的自然顺序(ConcurrentMap)。也就是说,您可以想象两个队列具有相同的数据,只是顺序不同。我
在 Java 中,我经常需要懒惰地获取 ConcurrentMap 的条目,仅在必要时才创建。 例如我可能有 ConcurrentMap> a = new ConcurrentHashMap<>();
我经常想要访问(并且可能添加/删除)给定 ConcurrentMap 的元素,以便一次只有一个线程可以访问任何单个键。做这个的最好方式是什么?同步 key 本身不起作用:其他线程可能通过 equal
休息服务有许多彼此不相关的客户。每个客户都可以随时开始投票过程。一旦客户添加了第一票,我就会在 中创建一个条目 ConcurrentMap> votesByCustomer; 每个投票都有 voteT
我有以下代码。即使集合本身不是线程安全的,它也会是线程安全的吗? private ConcurrentMap> proxyRoles = new ConcurrentHashMap>(); p
使用 Java 8,我在 java.util.concurrent.ConcurrentMap 上实现了一个包装器接口(interface),特别是 remove(Object key)方法。由于我需
我有一段代码可以由多个线程执行,这些线程需要执行 I/O 绑定(bind)操作以初始化存储在 ConcurrentMap 中的共享资源。我需要使此代码线程安全并避免不必要的调用来初始化共享资源。这是错
AbstractConcurrentMap是Groovy中的核心类,它用于存储在运行时添加到Groovy类中的动态属性。我正在使用 Grails 2.1.2 和 Groovy 1.8.8,但我认为所有
我正在声明一个 MultiMap,并想知道将键设置为 Integer 是否是一个好主意。使用整数键与字符串键会加快检索值的速度吗? MultiMap mmCustomerOrders = hz.get
在 Java 的 ConcurrentMap 中, 有 remove(key, expectedValue) ,这将返回以下之一: 预期值在那里,但已被删除。 预期值不存在,因此未被删除。 但我想要得
很多人将 ConcurrentMap 称为缓存。 这样做是个好主意吗: public List listTasks(final ProcessDefinition def, final boolean
我正在尝试反序列化其中包含 ConcurrentMap 的对象,但出现异常。 Caused by: java.lang.IllegalArgumentException: Can not set ja
我有一个java类来处理多线程订阅服务。通过实现 Subscribable 接口(interface),可以将任务提交到服务并定期执行。代码草图如下所示: import java.util.concu
我是一名优秀的程序员,十分优秀!