Java:缓存计算结果的数据结构?
我有一个昂贵的计算,结果我想缓存。有没有办法用两把钥匙做一张地图?我正在考虑类似于Java:缓存计算结果的数据结构?,java,caching,map,tuples,computation,Java,Caching,Map,Tuples,Computation,我有一个昂贵的计算,结果我想缓存。有没有办法用两把钥匙做一张地图?我正在考虑类似于Map的东西 然后我可以检查: if (! cache.contains(thing1, thing2)) { return computeResult(); } else { return cache.getValue(thing1, thing2); } 伪代码。如果你使用的话,它的类有一个makeComputingMap方法,它完全按照你描述的做。作为免费奖励,它也是线程安全的(实现Concurre
Map
的东西
然后我可以检查:
if (! cache.contains(thing1, thing2)) {
return computeResult();
}
else {
return cache.getValue(thing1, thing2);
}
伪代码。如果你使用的话,它的类有一个makeComputingMap
方法,它完全按照你描述的做。作为免费奖励,它也是线程安全的(实现ConcurrentMap
)
至于双键的事情,你必须创建一个包含这两个键的类,并实现一个合适的实现
equals
,hashCode
,和(如果适用的话)compareTo
,以你想要的方式进行键比较。你需要创建一个包含Thing1和Thing2的类,例如:
class Things {
public final Thing1 thing1;
public final Thing2 thing2;
public Things(Thing1 thing1, Thing2 thing2) {
this.thing1 = thing1;
this.thing2 = thing2;
}
@Override
public boolean equals(Object obj) { ... }
@Override
public int hashCode() { ... };
}
然后使用它:
Things key = new Things(thing1, thing2);
if (!cache.contains(key) {
Integer result = computeResult();
cache.put(key, result);
return result;
} else {
return cache.getValue(key);
}
注意,您必须实现equals和hashcode,以使此代码正常工作。如果您需要此代码是线程安全的,那么请查看ConcurrentHashMap。听起来您需要备忘录。最新的行李箱头部有一个记忆产品类型
P1
,该产品为一个计算建模,其结果被缓存
您可以这样使用它:
P1<Thing> myThing = new P1<Thing>() {
public Thing _1() {
return expensiveComputation();
}
}.memo();
P1神话=新P1(){
公共事务{
返回expensiveComputation();
}
}.memo();
第一次调用_1()将运行昂贵的计算并将其存储在备忘录中。然后,返回备忘录
对于“两把钥匙”,您需要一个简单的配对类型。Functional Java也以类P2
的形式提供了这一功能。要记住这样的值,只需使用P1
您还可以使用Promise
类代替备忘录。这在库中已经有一段时间了,所以您只需要最新的二进制文件。您可以按如下方式使用:
Promise<Thing> myThing =
parModule(sequentialStrategy).promise(new P1<Thing>() {
public Thing _1() {
return expensiveComputation();
}
});
承诺神话=
parModule(顺序策略).promise(新P1(){
公共事务{
返回expensiveComputation();
}
});
要获得结果,只需调用myThing.claim()
Promise
还提供了将函数映射到结果的方法,即使结果尚未准备好
您需要
导入静态fj.control.parallel.ParModule.ParModule
和fj.control.parallel.Strategy.sequentialStrategy
。如果希望计算在自己的线程中运行,请将顺序策略
替换为策略
类提供的其他策略之一。。。我五分钟前刚做了这个,然后来了,看到了这些问题。。。我推荐hashCode方法的这个实现(这只是默认的eclipse实现):return(31+thing1.hashCode())*31+thing2.hashCode()
@Kip:事实上,我建议使用Apache Commons Lang提供的HashCodeBuilder
、EqualBuilder
、和CompareToBuilder
。:-)我完全支持谷歌收藏,但我很难理解这是如何工作的。您基本上创建了一个函数
对象来调用您的计算机结果
函数。当您从地图中获得适当的项目时,Google对象将负责调用该函数并缓存其值。:-)