0

我想从中获取和删除一个项目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克隆所有项目?这是一个沉重的电话吗?如果考虑性能,哪种方式更好。

4

1 回答 1

2

这些调用之间没有真正的区别,因为Cache#asMap()定义为:

以线程安全映射的形式返回存储在此缓存中的条目的视图。对地图的修改直接影响缓存

调用的性能asMap() 可能稍差(因为可能必须创建一个视图),但时间是恒定的(并且可以忽略不计)并且是一个实现细节(有关更多详细信息,请参见内部 GuavaLocalCacheLocalManualCache)。

更重要的是,更惯用,如果您不需要与键关联的返回值Cache#invalidate(K),我建议使用它而不是地图视图方法(在下面的 @BenManes 评论后编辑) ,否则使用地图视图。

于 2017-04-14T11:14:35.023 回答