简体   繁体   English

RxJava:动态创建Observables并将最终结果作为Observable发送

[英]RxJava: dynamically create Observables and send the final resut as Observable

I am using RxJava in which I want to dynamically create a number of Observables based on some condition. 我正在使用RxJava,在其中我要根据某些条件动态创建多个Observable。 Once I'm done with creating, I want to do some processing on the different values returned by the observables and then send as a single Observable to which I can subscribe on. 创建完之后,我想对可观察对象返回的不同值进行一些处理,然后将其作为可订阅的单个可观察对象发送。 Here is how my code is : 这是我的代码:

List<String> valueList = .... 

List<Observable<String>> listOfObservables = new ArrayList<Observable<String>>();

for(int i =; i <valueList.size(); i++){
        listOfObservables.add(new SomeClass.doOperation(valueList(i)));
        // SomeClass.doOperation will return an Observable<String>
    }

return Observable.merge(listOfObservables);

But here , I want to do some operation on the values emitted by different Observables in the listOfObservable and finally return it as a single Observable<String> 但是在这里,我想对listOfObservable不同Observable发出的值做一些操作,最后将其作为单个Observable<String>

Like in Observable.zip() , I can do this like 就像在Observable.zip() ,我可以这样做

return Observable.zip(observable1, observable2, (string1, string2) -> {
            // joining final string here
            return string1 + string2;

But I know the number of arguments here. 但是我知道这里的论点数量。 Please let me know how I can achieve this. 请让我知道我如何实现这一目标。

Use the zip overload that takes a variable number of arguments , it has a signature of 使用带可变数量参数zip重载,其签名为

<R> Observable<R> zip(Iterable<? extends Observable<?>> ws,
                      FuncN<? extends R> zipFunction)

Example usage: 用法示例:

List<String> valueList = .... 

return Observable.from(valueList)
    .map(string -> SomeClass.doOperationThatReturnsObservable(string))
    .toList()
    .flatMap(listOfObs -> Observable.zip(listOfObs, (Object[] results) -> {
       // do something with the strings in the array.
       return Arrays.stream(results)
                    .map(Object::toString)
                    .collect(Collectors.joining(","));
    }));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM