如何从Guava 17替换Guava新的MapMaker()。softValues()。makeMap()

时间:2019-01-22 11:47:19

标签: java guava

我在此使用Guava 17.0

private static final ConcurrentMap<String, Buffered> imageMap =
        new MapMaker().softValues().makeMap();

刚刚更新为Guava 27,发现softValues()已移至CacheBuilder 这样我就可以

CacheBuilder.newBuilder().softValues()

但是没有makeMap()方法,所以我要替换为什么。

1 个答案:

答案 0 :(得分:3)

请参见MapMakerMigration on Wiki

  

已弃用MapMaker上与缓存相关的所有方法   CacheBuilder中的类似方法,并计划在不久的将来   删除。 (...)

     

大多数MapMaker用例应迁移到CacheBuilder或   AtomicLongMap。具体来说,使用MapMaker构建   具有AtomicLong值的地图通常应迁移到   AtomicLongMap。 MapMaker缓存功能为   已使用(包括对MapMaker.makeComputingMap(Function)的所有使用)   应该迁移到CacheBuilder

问题是:您真的需要使用ConcurrentMap界面吗?如果是,请使用asMap()视图,该视图用于非计算地图应具有相同的功能:

  

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

在您的情况下,这将是:

private static final Cache<String, Buffered> IMAGE_CACHE = CacheBuilder.newBuilder()
    .softValues()
    .build();

然后使用CACHE.asMap()或将.asMap()与带有显式类型参数的字段一起使用:

private static final ConcurrentMap<String, Buffered> IMAGE_MAP =
    CacheBuilder.newBuilder()
        .softValues()
        .<String, Buffered>build()
        .asMap();