番石榴:Cache.asMap().remove() 更好吗?

Guava : Is Cache.asMap().remove() better?

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

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

Returns a view of the entries stored in this cache as a thread-safe map. Modifications made to the map directly affect the cache.

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

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