【问题标题】:RxJava zip with empty list of observables带有空的可观察对象列表的 RxJava zip
【发布时间】:2019-04-15 18:53:02
【问题描述】:

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

所以由于我一直从Single.zip接收NoSuchElementException

这是我的示例代码

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(""))

这会很好用。

那么有没有更好的解决方案呢?我怎样才能避免这个错误?

【问题讨论】:

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


    【解决方案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 之前测试列表是否为空。

    这真的取决于你想要什么行为(除了不抛出异常)。

    【讨论】:

      【解决方案2】:

      您需要事先提供空置检查。这可以为 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");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多