10

複数の Observable をまとめて圧縮し、Observable になるように変換しています。

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

私ができるようにしたいのは:

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

flatZip が存在しない場合、これを行う最もクリーンな方法は何ですか (おそらく提出する必要があります)。現時点では、結果自体を flatMap する必要があります。

4

4 に答える 4

12
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));
    }
}
于 2016-01-27T22:55:31.393 に答える
0

私のプロジェクトで最終的に使用したものは次のとおりです。

/**
 * 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));
}
于 2016-08-31T12:03:10.523 に答える
-1

最も簡単なことは次のようになります

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

お役に立てれば

アナンド・ラマン

于 2014-10-08T18:36:38.867 に答える