gpt4 book ai didi

java - 使用 Supplier Java 8 进行缓存

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:00 27 4
gpt4 key购买 nike

据我所知,此方法会记住(缓存)作为参数传递的供应商的值。据我了解,它的行为类似于单例模式。谁能解释它是如何工作的?

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

用法如下:

Supplier<SomeClass> cachedValue = memoize(() -> someClassObject.getSomeValueToBeCached());
cachedValue.get().doMethod();

最佳答案

好吧,让我们逐步重写代码,以实现更老式、冗长的 Java。也许这样更容易理解。

第一步:摆脱 lambda:

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) 的局部变量,但“普通”类不能,因此我们将列表移至缓存供应商。

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。

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

也许这样更容易理解。如果您仍然不清楚某些事情,请在评论中提问我会尽力解释。

关于java - 使用 Supplier Java 8 进行缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44176953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com