java - Google Guava 的 CacheLoader loadAll() 方法实现问题

标签 java guava

我很想知道 google guava 11.0 库中引入的 loadAll 方法实现的有效方式是什么。

下面是描述load all方法实现扩展的代码
根据 CachesExplained 的示例

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder().maximumSize(1000)
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(
   new CacheLoader<Key, Graph>() {
     public Graph load(Key key) { // no checked exception
       return getGraphFromDatabase(key);
     }

     public Map<Key, Graph> loadAll(Iterable<? extends K> keys) {
         return getAllGraphsFromDatabase(keys);
     }
   }
);

private Map<Key, Graph> getAllGraphsFromDatabase(Iterable<? extends key> keys)
{
  lListOfGraph = //resultset got from DB Call
  for (lCount = 0; lCount < lListOfGraph.size(); lCount++)
  {
     lGraph = (Graph)lListOfGraph.get(lCount).get(0);
     graphs.asMap().put((key , lGraph);
  }
  return (Map<key, Graph>) graphs;
}

这里的返回类型是 Map 抛出错误 java.lang.ClassCastException:com.google.common.cache.LocalCache$LocalLoadingCache cannot be cast to java.util.Map (知道加载缓存对象不能是类型的事实 map )

如果这不是使用 LoadingCache 的正确实现方式,那么 LoadingCache的Component中数据是如何注入(inject)的,从而可以作为Cache使用。

最佳答案

您的getAllGraphsFromDatabase 方法应该从底层数据存储中获取值。 LoadingCache 实现会为您处理将返回值添加到 map 中。

我认为你的加载方法应该是这样的:

private Map<Key, Graph> getAllGraphsFromDatabase(Iterable<? extends key> keys)
{
  final List<Graph> lListOfGraph = //resultset got from DB Call

  final Map<Key, Graph> map = new HashMap<Key, Graph>(listOfGraph.size());
  for (final Graph graph : lListOfGraph)
    map.put(graph.getKey(), graph);

  return map;
}

关于java - Google Guava 的 CacheLoader loadAll() 方法实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11794297/

相关文章:

java - 在创建初始 JAX-WS 项目方面需要帮助

java - 使用 javax.ws.rs 的 Twitter oauth2

java - 未找到响应类 ArrayList 的消息正文编写器

java - 如何将 List<A> 转换为 List<B>?

java - 双向多图等效数据结构

java - 从 Java 中的字符串中删除尾部斜杠

java - 实现贝叶斯网络

Android:无法在 Google Guava 的 ImmutableSortedSet 中调用 SortedSet 方法

java - 使用Guava的ComparisonChain比较包含罗马数字的字符串

java - 为什么这个函数可能返回 null?