首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用供应商Java 8进行缓存

使用供应商Java 8进行缓存
EN

Stack Overflow用户
提问于 2017-05-25 09:27:30
回答 2查看 3.2K关注 0票数 7

据我所知,此方法存储(缓存)作为参数传递的供应商的值。据我所知,它的行为类似于单例模式。有人能解释一下它的工作原理吗?

代码语言:javascript
复制
  public static <T> Supplier<T> memoize(final Supplier<? extends T> valueSupplier)
  {
    final List<T> memoryList= new ArrayList<>();
    return () -> {
      if (memoryList.isEmpty()) {
        memoryList.add(valueSupplier.get());
      }
      return memoryList.get(0);
    };
  }

这样的用法:

代码语言:javascript
复制
Supplier<SomeClass> cachedValue = memoize(() -> someClassObject.getSomeValueToBeCached());
cachedValue.get().doMethod();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-25 09:41:24

好的,让我们用更老风格的、冗长的Java用小步骤重写代码。也许这会让我们更容易理解。

第一步:摆脱羔羊:

代码语言:javascript
复制
public static <T> Supplier<T> memoize(final Supplier<? extends T> valueSupplier)
{
    final List<T> memoryList= new ArrayList<>();
    return new Supplier<T>() {
        @Override
        public T get() {
            if (memoryList.isEmpty()) {
                memoryList.add(valueSupplier.get());
            }
            return memoryList.get(0);
        }
    };
}

下一步:将匿名内部类提取为独立类。虽然匿名类可以访问其包含方法(memoryList)的局部变量,但是“普通”类没有访问,因此我们将列表移到缓存提供者中。

代码语言:javascript
复制
class CachingSupplier<T> implements Supplier<T> {

    final List<T> memoryList= new ArrayList<>();
    private Supplier<T> originalSupplier;

    public CachingSupplier(Supplier<T> originalSupplier) {
        this.originalSupplier = originalSupplier;
    }

    @Override
    public T get() {
        if (memoryList.isEmpty()) {
            memoryList.add(originalSupplier.get());
        }
        return memoryList.get(0);
    }
}

public static <T> Supplier<T> memoize(final Supplier<? extends T> valueSupplier) {
  return new CachingSupplier<>(valueSupplier);
}

最后,让我们用一个简单的引用来替换ArrayList。

代码语言:javascript
复制
class CachingSupplier<T> implements Supplier<T> {

    private T cachedValue;
    private Supplier<T> originalSupplier;

    public CachingSupplier(Supplier<T> originalSupplier) {
        this.originalSupplier = originalSupplier;
    }

    @Override
    public T get() {
        if (cachedValue == null) {
            cachedValue = originalSupplier.get();
        }
        return cachedValue;
    }
}

public static <T> Supplier<T> memoize(final Supplier<? extends T> valueSupplier) {
  return new CachingSupplier<>(valueSupplier);
}

也许这更容易理解。如果你对某些事情还不清楚,请发表评论,我会尽力解释的。

票数 7
EN

Stack Overflow用户

发布于 2017-05-25 09:36:46

这个怎么样?

代码语言:javascript
复制
public static <T> Supplier<T> memoize(final Supplier<? extends T> factory) {
    final List<T> cache = new ArrayList<>();
    return () -> {
               // v--- check the value is cached?
        if (cache.isEmpty()) {
                           // v--- return the value created by factory
            cache.add(factory.get());
               // ^--- adding the value into the cache
        }
        return cache.get(0); 
                  // ^--- return the cached value
    };
}

用法

代码语言:javascript
复制
Supplier<String> factory = ()-> new String("foo"); 

assert factory.get() == factory.get(); // return false;
assert memoize(factory).get() == memoize(factory).get(); //return false;

                 // v--- storing the memoized factory for using as further
Supplier<String> memoized = memoize(original);
assert memoized.get() == memoized.get(); // return true.
                    // ^--- they are the same.  
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44176953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档