【问题标题】:RxJava - zip list of ObservableRxJava - Observable 的压缩列表
【发布时间】:2020-03-27 19:31:58
【问题描述】:

我有一个 Observable 列表 (RxJava 1)。

List<Observable> observableList = new ArrayList<>();

它可以包含至少 1 个 Observable。每个都有相同类型的结果。

如何压缩所有 Observable 的结果?

我考虑过 zip-operator,但它不支持 List,我不知道 observables 的数量(可以是 1,2,3,4....)

【问题讨论】:

标签: java android rx-java


【解决方案1】:

您可以使用静态zip(java.lang.Iterable&lt;? extends Observable&lt;?&gt;&gt; ws,FuncN&lt;? extends R&gt; zipFunction) method

这是一个zip 方法,它采用Observables 的Iterable 和一个FuncN(其call 方法采用varargs 参数)并使用它来组合相应的发射@ 987654330@s 到结果中,新返回的Observable 将省略。

例如你可以这样做:

Observable.zip(observableList, new FuncN(){
    public ReturnType call(java.lang.Object... args){
        ReturnType result; //to be made
        //preparatory code for using the args
        for (Object obj : args){
            ReturnType retObj = (ReturnType)obj;
            //code to use the arg once at a time to combine N of them into one.
        }
        return result;
    }
});

【讨论】:

    【解决方案2】:

    ReactiveX - Zip 运算符

    BiFunction 之外的压缩

    Zip 将多个 Observable 的发射通过一个 指定函数并根据每个组合发出单个项目 这个函数的结果

    这里,list 是您想要传递的任何类型的 Observable 的数组列表。

    val list = arrayListOf<Observable<ImageUrlResponse>>()
    
    
    Observable.zip(list) { args -> Arrays.asList(args) }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({
            val response = it[0]
            val imageUrlResponse = imageUrlObject as ImageUrlResponse
            urls.add(imageUrlResponse.imageUrl)}
                   }, {
            val c = it
     })
    

    以下订阅的结果就是下面这张图。就像我们期望它被压缩在一起一样。您是否还注意到它会将所有响应压缩到一个 java.lang.Object[] 中。

    请注意,我必须键入转换数组列表才能访问我的单个对象,因为它是 Any 类型!

    【讨论】:

      【解决方案3】:

      我也为此苦苦挣扎,并使用 Sharan 的解决方案作为我的基础。

      我的用例是对几个第 3 方提供商进行 API 调用,然后将每个单独的结果放入一个列表中。列表中的每个项目都包含 API 返回的内容,无论是成功还是失败。

      最后它实际上看起来很优雅。在我的具体情况下,“ResultType”被替换为“ApiGenericResponseObject”之类的东西。

      Observable.zip(listOfObservables, args -> {
          List<ResultType> result = new ArrayList<>();
          for (Object o: args) {
              ResultType c = (ResultType) o;
              // additional code here, I am just concatenating them together
              // This gives me a list with the individual result of each Observable (for instance an API call)
              result.add(c);
          }
          return result;
      });
      

      另外,作为 Lambda,它看起来更整洁。虽然我想知道阅读本文的人是否会理解发生了什么:

      Observable.zip(listOfObservables, args -> Arrays.stream(args)
          .map(object -> (ResultType) object)
          .collect(Collectors.toList())
      );
      

      希望对你有帮助!

      【讨论】:

      • 如果我执行三个网络调用“A”、“B”和“C”,这是否会保留它们返回的顺序? (我需要将网络请求与其各自的响应相匹配)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多