java - 如何将 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> 值填充缓存的建议。
解决方案
任何 guava 缓存实现都可以通过 map 填充。以下方法是 Guava Cache 接口的一部分:
void putAll(Map<? extends K, ? extends V> var1);
话虽如此,您错误地使用了 LoadingCache。当缓存中不存在 key 时,缓存加载器提供逻辑来确定与key对应的值。因此,缓存加载器返回值对象(在您的情况下为字符串)。
推荐阅读
- mule - 在以下 Web 服务中替换 mule 和 jetty 的替代方法是什么?
- node.js - 缓冲区在节点 js 中如何工作?
- laravel-5 - 如何修复 Laravel 5.8 中的 .htaccess 问题
- javascript - 有没有一种方法可以在树形图中为特定父级的子级实现颜色深浅
- batch-file - 为文件夹创建日期格式时出错
- c++ - 为什么在 C++ 中使用虚函数
- php - 在循环PHP中将3个月添加到给定日期
- c++ - 在运行时选择给定的命名空间
- node.js - 如何修复“未捕获的错误:无法解析 AuthService 的所有参数:(?)。”
- c# - 无法解析 Azure 微服务中的类型的服务