int addOne(int a) { return a + 1;}
我的想法是有一个hashmap
这样的东西,您可以在其中存储以前的答案并在以后查找它们。我想这可以通过lambda表达式来完成,但我不太熟悉它们。我不太确定如何编写这个方法,希望得到一些帮助。
用这种方法能做到这一点吗?
在Java8中,您可以使用ConcurrentHashMap.ComputeIFEstant
:
Map<Integer, Integer> cache = new ConcurrentHashMap<>();
Integer addOne(Integer x) {
return cache.computeIfAbsent(x -> x + 1);
}
DZone有一个很好的教程,它提供了一个适用于任何方法的解决方案:
memoizer
类非常简单:
public class Memoizer<T, U> {
private final Map<T, U> cache = new ConcurrentHashMap<>();
private Memoizer() {}
private Function<T, U> doMemoize(final Function<T, U> function) {
return input -> cache.computeIfAbsent(input, function::apply);
}
public static <T, U> Function<T, U> memoize(final Function<T, U> function) {
return new Memoizer<T, U>().doMemoize(function);
}
}
Integer longCalculation(Integer x) {
try {
Thread.sleep(1_000);
} catch (InterruptedException ignored) {
}
return x * 2;
}
Function<Integer, Integer> f = this::longCalculation;
Function<Integer, Integer> g = Memoizer.memoize(f);
public void automaticMemoizationExample() {
long startTime = System.currentTimeMillis();
Integer result1 = g.apply(1);
long time1 = System.currentTimeMillis() - startTime;
startTime = System.currentTimeMillis();
Integer result2 = g.apply(1);
long time2 = System.currentTimeMillis() - startTime;
System.out.println(result1);
System.out.println(result2);
System.out.println(time1);
System.out.println(time2);
}
2
2
1000
0
问题内容: 我的代码中有一些函数,使用记忆很有意义(甚至是强制性的)。 我不想为每个功能分别手动实现。有什么办法(例如在Python中),我可以只使用注释或做其他事情,以便在需要的地方自动获得这些注释? 问题答案: Spring 3.1现在提供了一个注释,它可以做到这一点。 顾名思义,@Cacheable用于划分可缓存的方法-即将结果存储到缓存中的方法,以便在后续调用(具有相同参数)时返回缓存中的
A我是Drools的新手,读过一些文档和教程,当然,我的问题有一个简单的解决方案。我使用onle规则文件和类计数器,如下所示。环境为:Wintel JDK 1.7(71),DROOLS 6.1.0 有个规矩 这是kModule 跑步的结果 我的问题是: > 为什么“反淋浴1”规则只涉及最后插入的事实?是否存在任何隐藏行为? 3、为什么在count==1的retract object Counter
问题内容: Java应该没有内存泄漏,但是仍然可能。当我的程序出现内存泄漏时,我可以修复它(我希望)。但是,当某些第三方程序包具备该功能时,我该怎么办?几乎什么都没有,除非不使用此软件包。 还有其他解决方案吗?我喜欢沙盒的想法。您被允许在某个区域内做任何您想做的事情,而您的“身体上的”没有能力打扰其他人。有没有办法为Java中的内存使用创建此类沙箱?想象一下=创建用于内存使用的沙箱,允许某些程序包
使用Java的工作代码: C++代码用dictionary[“Apple”,“Pen”]返回“ApplePenApple”的false,我不知道为什么java返回true是正确的。这两种解决方案之间唯一的主要区别(我认为)是我的C++在java代码中使用向量而不是原生数组。最初,我认为这可能与C++使用自动存储(堆栈)而不是自由存储(堆)有关,这就是为什么我使用向量而不是C样式的数组来避免内存管理
本文向大家介绍实现一个函数记忆的方法相关面试题,主要包含被问及实现一个函数记忆的方法时的应答技巧和注意事项,需要的朋友参考一下 同步运算结果缓存,这个就老生常谈了: 但单例模式算不算函数记忆呢,异步缓存走 await 算不算呢
问题内容: 我有一个程序可以通过递归传递大量数据,例如1000个变量。递归将至少运行50或60次。我担心的是,由于没有足够的空间,是否有可能数据在内存位置上被覆盖,或者如果没有内存,那么我会得到一些例外,即程序内存已经用完(我没有收到这样的错误)? 是否存在错误的解决方案,因为该程序没有更多的内存并且在现有位置上被覆盖? 问题答案: 涉及两个存储区域:堆栈和堆。堆栈是保存方法调用的当前 状态 (即