如何将 concurentHashMap 转换为 Guava Cache <Key, Pair>

How to convert concurentHashMap into Guava Cache <Key, Pair>

假设我们有一个方法 returns ConcurentMap 与 对用于数字的旧值和新值。

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;
            }
        });
    }

我想用方法 getAllOldAndNewPairs()

中的 记录填充 guava 缓存

到目前为止我有这样的方法:

    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();

Required Type: String - Provided: Concurrent Map<String, String>

我正在尝试:

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

或者这并没有带来理想的效果。

对于如何解决此问题并使用方法 getAllOldAndNewPairs 中的 值填充缓存的建议,我将不胜感激。

任何番石榴缓存实现都可以通过地图填充。以下方法是 Guava 缓存接口的一部分:

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

也就是说,您没有正确使用 LoadingCache。当键不存在于缓存中时,缓存加载器提供逻辑来确定对应于 keyvalue。因此,缓存加载程序 returns 值对象(在您的情况下为字符串)。