如果可能完成,则将Maybe从另一个源转换为单个

我想建立一个Repository类,返回一个Single

该类首先应该查找返回MaybeCache ,如果Maybe完成了我的Service ,返回Single

 interface Cache { fun getSomething(): Maybe } interface Service { fun getSomething(): Single } class Repository ( private val cache: Cache, private val service: Service ) { fun getSomething(): Single { return cache.getSomething() .????(feed.getSomething()) //onCompleteTransformToSingle() or similar } } 

我已经通过JavaDoc进行了搜索,但是似乎并不存在这种情况下的变换器。

有处理这个好方法吗?

这里有两个相当简单的选项,你可以使用。 首先我发现更明确。 第二个好处是您将在缓存中的任何错误时调用网络。

这些假设从缓存中返回一个Maybe。 例如,如果在缓存中找不到任何值,则返回Maybe.empty()

1)如果流中有空,switchIfEmpty()将使用调用网络的备用observable。 如果流中没有空的话,网络永远不会被调用。

 override fun getSomething(): Single { return cache.getSomething() .switchIfEmpty( Maybe.defer { feed.getSomething().toMaybe() } ) .toSingle() } 

2)一个空的可能会返回一个错误,当投掷toSingle(),触发网络调用。

 override fun getSomething(): Single { return cache.getSomething() .toSingle() .onErrorResumeNext { feed.getSomething() } } 

当需要使用元数据执行RxJava操作(不存在缓存结果)时,可能必须使用materialize()将观察链变换为元数据流。

(对于我在Kotlin中缺乏流畅性的道歉)

 fun getSomething(): Single { return cache.getSomething() .toObservable() .materialize() .take(1) .flatMap( it.hasValue() ? Single.just( it.getValue() ) : Single.fromCallable( apiCall() ) ); } 

materialize()运算符将观察者流转换为Notification流。 然后你可以检查第一个通知,如果它有一个值,就使用它。 否则,请拨打您的网络电话。