RxJava zip带有可观察变量的空列表

时间:2019-04-15 18:53:02

标签: java android kotlin rx-java rx-java2

基于帖子类型,我需要将项目推送到可观察列表。因此,如果未使用if闭包(例如post.type != SomeType),我的可观察列表为空。

因此,由于我一直都从NoSuchElementException收到Single.zip

这是我的示例代码

val observableList = mutableListOf<Single<Response>>()

if (post.type == SomeType) {
      observableList.add(addNewObservable()) <-- adding API call to the lsit
}

return Single.zip(observableList) { arg -> arg } <-- Throws error NoSuchElementException

我认为我可以用于post type != SomeType

observableList.add(Single.just(Response(""))

这会很好的工作。

那么有更好的解决方案吗?我如何避免该错误?

2 个答案:

答案 0 :(得分:1)

如果您的列表可以合法地为空,则可能您希望使用Maybe而不是Single。一种方法是

val observableList = mutableListOf<Maybe<Response>>()
...
if (post.type == SomeType) {
      observableList.add(addNewObservable().toMaybe())
}
...
return Maybe.zip(observableList) { arg -> arg }
空列表上的

Maybe.zip应该返回一个Maybe,它会立即完成而不会发出任何东西。

或替代解决方案:只需在调用Single.zip之前测试列表是否为空。

这实际上取决于您想要什么行为(除了不引发异常)。

答案 1 :(得分:0)

您需要事先检查是否为空。这可以为 Observable 或 Single 完成。

public Observable<String> zipObservable(List<Observable<String>> strings) {
    return strings.isEmpty()
        ? Observable.just("empty")
        : Observable
           .zip(strings, objects -> "non-empty");
}

public Single<String> zipSingle(List<Single<String>> strings) {
    return strings.isEmpty()
        ? Single.just("empty")
        : Single
           .zip(strings, objects -> "non-empty");
}