我想得到&从Cache
final Cache<String, PendingRequest> pendingRequest = CacheBuilder.newBuilder().build();
// get first
pendingCall = pendingRequest.getIfPresent(key);
pendingRequest.invalidate(key); // then remove.
我还找到了另一种方式
pendingCall = pendingRequest.asMap().remove(key);
asMap
方法是否克隆了所有项目?这是一个沉重的电话?如果考虑绩效,哪种方式更好。
答案 0 :(得分:2)
这些调用之间没有真正的区别,因为Cache#asMap()
被定义为:
将此缓存中存储的条目视图作为线程安全映射返回。 对地图所做的修改会直接影响缓存。
调用asMap()
可能性能稍差(因为可能需要创建视图)但时间是恒定的(并且可忽略不计)并且是实现细节(请参阅内部番石榴) LocalCache
and LocalManualCache
classes了解更多详情)。
更重要的是,Cache#invalidate(K)
更具惯用性,如果您不需要退货,我建议您使用它而非地图查看方法(在@BenManes'评论后编辑)与键关联的值,否则使用地图视图。