使用Guava对集合进行缓存过滤

时间:2016-03-17 09:37:10

标签: java guava google-guava-cache

我正在开发一个对自动机执行某些操作的程序。自动机由状态(即节点)和转换(又称边缘)组成,我需要过滤它们以检索具有特定属性的集合。这个操作很容易实现,但它执行了几次,我会在上面写一点缓存。

在下面的代码片段中有我的实现,我想知道过滤和记忆可观察过渡的正确方法

public class Automata {
    private State initial;
    private Set <State> states; 
    private Set <Transition> transitions;
    private Supplier <Set <Transition>> observables;

    // ...

    public Automata() {
        this.initial = new State();
        this.states = new HashSet <> ();
        this.transitions = new HashSet <> ();

        this.observables = Suppliers.memoize(() ->
           transitions.stream().filter((t) -> 
              (t.isObservable() == true)).collect(Collectors.toSet()));
    }

    public getObservables() {
         return observables.get();
    }
}

问题:

  1. 这是对的吗?
  2. 如果转换更改其可观察性,此信息也会传播给供应商吗?
  3. 对不起我的英语很差,我希望这很清楚。

1 个答案:

答案 0 :(得分:2)

  1. 是的,这是对的。
  2. 不会,您在转场中所做的更改不会自动传播。对于这种情况,供应商AFAIK不适合。 您需要像这样手动覆盖它:

    public void invalidate(){
        memorized = Suppliers.memoize(supplier);
    }
    

    如果您知道您的更新不会那么频繁并且您不需要可靠的读取,那么memoizeWithExpiration也会有效。

    或者您只需要使用Cache,例如:

    CacheLoader<Key, Graph> loader = new CacheLoader<Key, Graph>() {
      public Graph load(Key key) throws AnyException {
        return createExpensiveGraph(key);
      }
    };
    LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder().build(loader);