RxJava - Observable

时间:2017-04-20 16:10:45

标签: java android rx-java

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

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

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

如何压缩所有Observables的结果?

我想到了zip-operator但它不支持List,我不知道可观察量的数量(可以是1,2,3,4 ......)

4 个答案:

答案 0 :(得分:15)

您可以使用静态zip(java.lang.Iterable<? extends Observable<?>> ws,FuncN<? extends R> zipFunction) method

zip方法采用IterableObservableFuncNcall参数Object })并使用它将相应的发出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; } }); 省略。

例如,您可以这样做:

not (...)

答案 1 :(得分:4)

ReactiveX-Zip运算符

超越BiFunction的邮政编码

  

Zip将多个Observable的排放量通过   指定的功能并根据以下内容为每个组合发出单个项目   该功能的结果

在这里,列表是要传递的任何类型的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!

enter image description here

答案 2 :(得分:1)

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

我的用例是对多个第三方提供程序进行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())
);

希望有帮助!

答案 3 :(得分:0)

您可以.stream ping .reduceList .zip {}:

final Observable<YourType> result = observableList.stream()
        .reduce((observable1, observable2) ->
                Observable.zip(observable1, observable2, YourTypeCombiner::methodToCombineTwoObjectsOfYourType))
        .orElse(Observable.just(defaultValueForYourType));

例如结果将发出new Integer(10)

final List<Observable<Integer>> observableList = ImmutableList.of(
        Observable.just(1), Observable.just(2), Observable.just(3), Observable.just(4));

final Observable<Integer> result = observableList.stream()
        .reduce((num1, observable2) ->
                Observable.zip(observable1, observable2, Integer::sum))
        .orElse(Observable.just(0));

不包括错误处理。