2016-08-29 1 views
1

Я использую RxJava, в котором хочу динамически создавать несколько Observables на основе некоторого условия. Как только я закончил создание, я хочу сделать некоторую обработку на разных значениях, возвращаемых наблюдаемыми, а затем отправить как единый Observable, на который я могу подписаться. Вот как мой код:RxJava: динамически создавать Observables и отправлять окончательный результат как Observable

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); 

Но здесь, я хочу сделать некоторые операции по значениям, излучаемых различными наблюдаемыми, в listOfObservable и, наконец, вернуть его в качестве одного Observable<String>

Как и в Observable.zip(), я может сделать это как

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

Но я знаю количество аргументов здесь. Пожалуйста, дайте мне знать, как я могу это достичь.

ответ

0

Используйте zip перегрузки that takes a variable number of arguments, она имеет подпись использования

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

Пример:

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(",")); 
    })); 
+0

Пожалуйста, вы можете объяснить больше? как я могу получить отдельные строки для выполнения операций? – v1shnu

+0

Я добавил пример использования. Имейте в виду, что если вы не заботитесь о порядке, возможно, 'merge', то' reduce' будет проще. –

+0

Спасибо человек. Это отлично работает! – v1shnu