- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
据我所知,此方法会记住(缓存)作为参数传递的供应商的值。据我了解,它的行为类似于单例模式。谁能解释它是如何工作的?
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/
根据甲骨文, static CompletableFuture supplyAsync(Supplier supplier)Returns a new CompletableFuture that i
当我尝试运行我的 SupplierConsumer 时遇到这些错误 eclipse 中的类。这是我的代码: public class SupplierConsumer{ public stat
我需要多次提供文件的 Stream 以便可以在不同时间对其执行不同的操作,我使用了以下供应商: Supplier> linesSupplier = () -> { try {
每当需要对象时,我都会使用 Supplier 创建列表的实例。 Supplier supplier = ()->Optional.of(new LinkedList<>()); 从 Recursive
本文整理了Java中org.jclouds.location.suppliers.all.ZoneToRegionToProviderOrJustProvider类的一些代码示例,展示了ZoneToR
给定以下类: class Logger { public void log(String someInfo, String someOtherInfo,
我想在 Kotlin 脚本中使用 Java 网络套接字 API 接收 HTTP 请求。 我只需要请求中的两行,所以我尝试将整个请求作为字符串行获取,对其进行迭代,并为这两行中的每一行获取与正则表达式匹
我用了Supplier经常,我在看新的 Guava 10 Optional现在。 与 Supplier 相比,Optional 保证永远不会返回 null,而是会抛出 IllegalStateExce
我一直在尝试使用 collect method of Stream , 将列表转换为 HashMap。我使用以下代码作为引用: String result = list.parallelStream(
如何将 Runnable 转换为 Supplier? public T useSupplier(Supplier supplier) { // Does something with sup
我有一个方法列表,其中有 Supplier用于返回不同类型的默认值的参数。但是,在某些情况下,我需要抛出异常(未经检查)而不是值。 目前,我必须为每个函数定义传递 lambda,但我想创建供应商实例以
我如何使用 Java8 Supplier 接口(interface)重写此工厂方法以提供正确的类型化实例? 我有一个扩展 Map 的简单接口(interface): public interface
所以我正在尝试重构以下代码: /** * Returns the duration from the config file. * * @return The duration. */ pr
前言 Java 8 中提供了许多函数式接口,包括Function、Consumer、Supplier、Predicate 等等。这 4 个接口就是本篇将要分享的内容,它们都位于 java.u
本文整理了Java中org.jclouds.location.suppliers.fromconfig.ZoneIdsFromConfiguration类的一些代码示例,展示了ZoneIdsFromC
为什么不能编译? : import java.util.Optional; public class Demo { Optional getOption() { return
为什么不能编译? : import java.util.Optional; public class Demo { Optional getOption() { return
我正在尝试查找给定字符串中的单词数。下面是它的顺序算法,效果很好。 public int getWordcount() { boolean lastSpace = true;
我正在尝试在这样的流中使用 Supplier 实现惰性评估 public static void main(String[] args) { Supplier> expensiveLi
据我所知,此方法会记住(缓存)作为参数传递的供应商的值。据我了解,它的行为类似于单例模式。谁能解释它是如何工作的? public static Supplier memoize(final Su
我是一名优秀的程序员,十分优秀!