,java,guava"/>

首页 > 解决方案 > 如何将 concurentHashMap 转换为 Guava Cache

问题描述

假设我们有一个返回 ConcurentMap 的方法,其中包含 <String, String> 对,用于表示旧的和新的数字值。

public ConcurrentMap<String, String> getAllOldAndNewPairs() {
        return databaseConnector.executeQuery(QUERY, new QueryLauncher<ConcurrentHashMap<String, String>>() {

            @Override
            public ConcurrentHashMap<String, String> processResult(Results results) throws DAOException {

                ConcurrentHashMap<String, String> oldAndNewPairs = new ConcurrentHashMap<>();
                while (results.next()) {
                    oldAndNewPairs.put(results.getString(Column.OLD_NUMBER), results.getString(Column.NEW_NUMBER));
                }
                return oldAndNewPairs;
            }
        });
    }

我想用方法中的 <Key, Pair> 记录填充番石榴缓存getAllOldAndNewPairs()

到目前为止,我有一个方法,如:

    public void propagateCache() {

        LoadingCache<String, String> loadingCache =
                CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String s) throws Exception {
                        return getAllOldAndNewPairs();
                    }
                });
    }

但目前 IDE 抱怨线路:

return getAllOldAndNewPairs();

必需类型:字符串 - 提供:并发 Map<String, String>

我正在尝试:

    LoadingCache<String, String> cache = CacheBuilder.newBuilder()
            .build(CacheLoader.from(this::getAllOldAndNewPairs));

要么这并没有带来理想的效果。

我将不胜感激有关如何解决此问题并使用方法 getAllOldAndNewPairs 中的 <Key, Pair> 值填充缓存的建议。

标签: javaguava

解决方案


任何 guava 缓存实现都可以通过 map 填充。以下方法是 Guava Cache 接口的一部分:

void putAll(Map<? extends K, ? extends V> var1);

话虽如此,您错误地使用了 LoadingCache。当缓存中不存在 key 时,缓存加载器提供逻辑来确定与key对应的。因此,缓存加载器返回值对象(在您的情况下为字符串)。


推荐阅读