2014-05-18 11 views
6

sto zippare più osservabili insieme e poi trasformandole in un modo che si traduce in un 'osservabile:flatZip in RxJava

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

Quello che mi piacerebbe essere in grado di fare è:

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

Qual è il modo più pulito per farlo, dato che flatZip non esiste (forse dovrei inviarne uno). Al momento sto facendo flatMap il risultato su se stesso.

risposta

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

Beh, la cosa più semplice da fare sarebbe la seguente

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

Spero che questo aiuti

Anand Raman

3

Che dire di questo:

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

Naturalmente, si' Ne avremo bisogno uno per ogni numero di argomenti, ma è così che va anche con zip. Indovinare che non è il punto dolente qui.

0

Ecco quello che ho finito per usare nel mio progetto:

/** 
* 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)); 
}