2014-05-18 15 views
6

mam skompresowanie wielu obserwable razem, a następnie przekształcenie ich w sposób, który powoduje zauważalnego:flatZip w RxJava

final Observable<Observable<M>> result = Observable.zip(obs1, obs2, transformFunc); 

Co chciałbym być w stanie zrobić, to:

final Observable<M> result = Observable.flatZip(obs1, obs2, transformFunc); 

Jaki jest najczystszy sposób, aby to zrobić, biorąc pod uwagę, że flatZip nie istnieje (może powinienem wysłać jeden). W tej chwili muszę flatMap wynik na siebie.

Odpowiedz

8
public class RxHelper { 

    public static <T1, T2, R> Observable<R> flatZip(Observable<? extends T1> o1, Observable<? extends T2> o2, final Func2<? super T1, ? super T2, Observable<? extends R>> zipFunction) { 
     return Observable.merge(Observable.zip(o1, o2, zipFunction)); 
    } 

    public static <T1, T2, T3, R> Observable<R> flatZip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Func3<? super T1, ? super T2, ? super T3, Observable<? extends R>> zipFunction) { 
     return Observable.merge(Observable.zip(o1, o2, o3, zipFunction)); 
    } 

    public static <T1, T2, T3, T4, R> Observable<R> flatZip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Func4<? super T1, ? super T2, ? super T3, ? super T4, Observable<? extends R>> zipFunction) { 
     return Observable.merge(Observable.zip(o1, o2, o3, o4, zipFunction)); 
    } 
} 
-1

Dobrze najprostszym rozwiązaniem byłoby następująco

final Observable<M> result = Observable.zip(obs1, obs2, (o1, o2) -> { 
    return new M(o1, o2); // construct a new M and return it from here. 
}); 

Hope this helps

Anand raman

3

Co o tym:

public static <A,B,C> Observable<C> flatZip(Observable<A> o1, Observable<B> o2, F2<A,B,Observable<C>> transformer) { 
    Observable<Observable<C>> obob = Observable.zip(o1, o2, (a, b) -> { 
     return transformer.f(a, b); 


    }); 

    Observable<C> ob = obob.flatMap(x -> x); 

    return ob; 
} 

oczywiście,” Potrzebuję jednego dla każdej liczby argumentów, ale tak też jest z suwakiem. Zgadywanie, które nie jest tutaj problemem.

0

Oto co ja skończyło się w moim projekcie:

/** 
* Zips results of two observables into the other observable. 
* Works like zip operator, except zip function must return an Observable 
*/ 
public static <T, V, R> Observable<R> flatZip(Observable<T> o1, Observable<V> o2, Func2<? super T, ? super V, Observable<R>> zipFunction) { 
    return Observable.zip(o1, o2, Pair::new).flatMap(r -> zipFunction.call(r.first, r.second)); 
}