Semble comme vous voulez memoisation. La dernière tête de tronc de Functional Java a un type de produit de memoising P1
qui modélise un calcul dont le résultat est mis en cache.
Vous l'utiliser comme ceci:
P1<Thing> myThing = new P1<Thing>() {
public Thing _1() {
return expensiveComputation();
}
}.memo();
Appel _1() la première fois se déroulera le calcul coûteux et le stocker dans le mémo. Après cela, le mémo est renvoyé à la place.
Pour vos "deux clés", vous souhaitez un type de paire simple. Java fonctionnel a aussi cela sous la forme de la classe P2<A, B>
. Pour mémoriser une telle valeur, utilisez simplement P1<P2<A, B>>
.
Vous pouvez également utiliser la classe Promise<A>
au lieu de l'annotation. Cela a été dans la bibliothèque pendant un moment, donc vous auriez juste besoin du dernier binaire. Vous l'utiliser comme suit:
Promise<Thing> myThing =
parModule(sequentialStrategy).promise(new P1<Thing>() {
public Thing _1() {
return expensiveComputation();
}
});
Pour obtenir le résultat, appelez simplement myThing.claim()
. Promise<A>
fournit également des méthodes pour mapper des fonctions sur le résultat même si le résultat n'est pas encore prêt. Vous devez import static fj.control.parallel.ParModule.parModule
et fj.control.parallel.Strategy.sequentialStrategy
. Si vous souhaitez que le calcul s'exécute dans son propre thread, remplacez sequentialStrategy
par l'une des autres stratégies fournies par la classe Strategy
.
Eerie .. J'ai * juste * fait cela il y a cinq minutes, puis je suis tombé sur SO et j'ai vu ces questions ... Je recommanderais cette implémentation de la méthode hashCode (qui est juste l'implémentation eclipse par défaut): 'return (31 + thing1.hashCode()) * 31 + thing2.hashCode(); ' – Kip
@Kip: En fait, je recommande d'utiliser' HashCodeBuilder', 'EqualsBuilder', et' CompareToBuilder' d'Apache Commons Lang. :-) –
Il m'a fallu <10 minutes pour l'implémenter, et maintenant mon programme fonctionne dans 25% des cas. Sensationnel. –