首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava -可观察对象的压缩列表

RxJava -可观察对象的压缩列表
EN

Stack Overflow用户
提问于 2017-04-21 00:10:45
回答 3查看 18.2K关注 0票数 18

我有一个可观察到的列表(RxJava 1)。

代码语言:javascript
复制
List<Observable> observableList = new ArrayList<>();

它可以包含至少1个可观察对象。每一个都有相同类型的结果。

如何才能压缩所有可观测数据的结果?

我想过zip-operator,但它不支持列表,而且我不知道观察值的数量(它可以是1,2,3,4……)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-21 01:35:59

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

它是一个zip方法,它接受Observables的IterableFuncN (它接受call方法的varargs参数),并使用它将相应发出的Objects组合成要由新返回的Observable省略的结果。

例如,你可以这样做:

代码语言:javascript
复制
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;
    }
});
票数 19
EN

Stack Overflow用户

发布于 2018-12-20 21:23:43

ReactiveX - Zip operator

超越BiFunction的Zip

Zip通过指定的函数将多个可观察对象的发射组合在一起,并根据此函数的结果为每个组合发射单个项目

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

代码语言:javascript
复制
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!

票数 16
EN

Stack Overflow用户

发布于 2020-03-27 19:31:58

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

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

最后,它实际上看起来相当优雅。在我的特定情况下,"ResultType“被替换为类似"ApiGenericResponseObject”的内容。

代码语言:javascript
复制
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,它看起来更整洁。尽管我想知道读了这篇文章的人是否会理解发生了什么:

代码语言:javascript
复制
Observable.zip(listOfObservables, args -> Arrays.stream(args)
    .map(object -> (ResultType) object)
    .collect(Collectors.toList())
);

希望它能帮上忙!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43524709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档