如何替换Guava 17中的Guava new MapMaker().softValues().makeMap()?

3

我使用的是Guava 17.0版本。

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

刚刚更新到Guava 27,发现softValues()已经被移动到CacheBuilder中,因此我可以这样做:

CacheBuilder.newBuilder().softValues()

但是没有makeMap()方法,我应该用什么来替换它呢?


我猜它被称为“build”。 - marstran
@marstran 嗯,它并没有返回一个ConcurrentMap。 - Paul Taylor
1
不,它返回一个线程安全的“Cache”。它还有一个“asMap”方法,可以返回一个“ConcurrentMap”。 - marstran
@mastran 好的谢谢,我有CacheBuilder.newBuilder().softValues().build().asMap(),但如何使它适用于字符串/缓冲参数而不仅仅是Object,Object呢? - Paul Taylor
2
使用类型参数调用build函数:CacheBuilder.newBuild().softValues().<String, Buffered>build().asMap() - marstran
@mastran 谢谢! - Paul Taylor
1个回答

4

请参见Wiki上的MapMakerMigration

MapMaker上的所有缓存相关方法已被弃用,建议使用CacheBuilder中的类似方法,并计划进行删除。 (...)

大多数MapMaker用例应迁移到CacheBuilderAtomicLongMap。特别是,当使用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();

谢谢,但我该如何正确声明参数(即String、Buffered)?我正在更新Guava以解决另一个问题,所以我只想修复我的代码,使其能够编译并继续工作,而不是进一步调查。 - Paul Taylor
我已经添加了一个例子。 - Grzegorz Rożniecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接