我有简单的Guava LoadingCache用例,我将关键对象列表传递给getAll
并实现loadAll
以获得缓存中不可用的结果。
问题是当缓存为空时,
getAll
收集记录会返回RegularImmutableMap
类型的地图。getAll
收集单条记录会返回SingletonImmutableBiMap
类型的地图。这最终会导致另一个问题。当我尝试收集map.values()
时,RegularImmutableMap
会返回ImmutableList
类型,而SingletonImmutableBiMap
会返回ImmutableSet
类型。
从用户的角度来看,为什么getAll
方法返回不同类型的ImmutableMap
有任何具体原因/优势?
答案 0 :(得分:1)
请注意,这与Cache
无关 - LocalCache
实施,您可能只是在返回收集的结果之前使用calls ImmutableMap.copyOf()
。
所以你的基本问题实际上是为什么ImmutableMap.of(K, V)
return an ImmutableBiMap
?
这是行为since 2012而简短的回答是因为ImmutableBiMap
扩展了ImmutableMap
,因此无需同时拥有SingletonImmutableMap
和SingletonImmutableBiMap
{1}}实施。
正如matoni所说,ImmutableMap.values()
会返回ImmutableCollection
,因此您无法依赖特定的实现来返回ImmutableList
或ImmutableSet
(或其他一些神秘类型)扩展ImmutableCollection
)。不仅如此,你不能依靠这种方式保持现有的行为!暂时(从February到June)ImmutableMap
实际上并没有使用ImmutableBiMap
。
这意味着您不应期望ImmutableMap.values()
返回ImmutableList
,并且执行此操作的任何代码都会被破坏。如果您需要来自ImmutableList
.asList()
的ImmutableCollection
- 对于大多数不可变集合,这可以在O(1)时间和空间中返回视图。