10

我将多个 Observable 压缩在一起,然后以一种产生 Observable 的方式对其进行转换:

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

我想做的是:

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

鉴于 flatZip 不存在(也许我应该提交一个),最干净的方法是什么。目前我不得不将结果放在自身上。

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 回答
3

那这个呢:

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

当然,对于每个数量的参数,您都需要一个,但这也是 zip 的方式。猜测这不是这里的痛点。

于 2014-10-12T16:22:44.047 回答
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 回答