如何记住 Single 发出的值?

How do I memoize the value emitted by a Single?

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

我会写

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

但这会在调用线程上执行昂贵的工作。

我会写

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

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

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

你可以使用 Single.cache():

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

cache() -> 存储来自当前 Single 的成功值或异常,并将其重播给后期的 SingleObservers。请查看 here 了解更多信息。