Звучит так, будто ты хочешь запоминания. Последний заголовок магистрали Функциональная Java имеет запоминающийся тип продукта P1
, который моделирует вычисления, результаты которых кэшируются.
Вы бы использовали это так:
P1<Thing> myThing = new P1<Thing>() {
public Thing _1() {
return expensiveComputation();
}
}.memo();
Вызов _1 () в первый раз запустит дорогостоящее вычисление и сохранит его в заметке. После этого возвращается памятка.
Для ваших "двух ключей" вам нужен простой тип пары. Функциональная Java имеет это тоже в виде класса P2<A, B>
. Чтобы запомнить такое значение, просто используйте P1<P2<A, B>>
.
Вы также можете использовать класс Promise<A>
вместо запоминания. Это было в библиотеке некоторое время, так что вам просто нужен последний бинарный файл. Вы бы использовали это следующим образом:
Promise<Thing> myThing =
parModule(sequentialStrategy).promise(new P1<Thing>() {
public Thing _1() {
return expensiveComputation();
}
});
Чтобы получить результат, просто позвоните myThing.claim()
. Promise<A>
также предоставляет методы для отображения функций на результат , даже если результат еще не готов .
Вам нужно import static fj.control.parallel.ParModule.parModule
и fj.control.parallel.Strategy.sequentialStrategy
. Если вы хотите, чтобы вычисления выполнялись в собственном потоке, замените sequentialStrategy
одной из других стратегий, предоставляемых классом Strategy
.