如何记忆Single发出的值?

时间:2017-12-15 20:56:01

标签: java rx-java2 memoization reactivex

假设我有一个昂贵的计算来创建一个对象。我希望通过subscribeOn()为调用者提供一些灵活性,以确定发生的位置。但由于副作用(例如,对象由某些外部数据存储支持),我也不想多次进行该计算。

我可以写

MyObject myObject = MyObject.createExpensively(params);
return Single.just(myObject);

但这会对调用线程进行昂贵的工作。

我可以写

Callable<MyObject> callable = () -> MyObject.createExpensively(params);
return Single.fromCallable(callable);

但这会在每次订阅时调用createExpensively()(带副作用),如果有多个订阅者,这不是我想要的。

如果我想确保createExpensively()只被调用一次,其副作用只发生一次,我在这里寻找的模式是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用Single.cache()

Single.fromCallable(() -> MyObject.createExpensively(params)).cache();

答案 1 :(得分:1)

Single.fromCallable(() -> MyObject.createExpensively(params)).cache();

cache() - &gt;存储当前Single中的成功值或异常,并将其重播到后期SingleObservers。有关详细信息,请查看here