RxJava2在单

时间:2017-03-09 13:15:29

标签: java rx-java2

在rxjava 1中,Observable有这个flatmap方法

public final Observable flatMap(Func1 collectionSelector, Func2 resultSelector)

这允许您将初始结果传递/合并到flatmap订阅者。

如何使用RxJava2获得相同的结果?

我有一个发出A的单身,我需要根据B获取A,然后同时使用AB执行操作

3 个答案:

答案 0 :(得分:5)

您在ObservableFlowable上的RxJava2上使用相同的方法,
但是,在RxJava1和2中,Single没有这样的运算符,您可以转换Single to Observable然后应用此运算符。

答案 1 :(得分:1)

您是否尝试过CombineLatest(http://reactivex.io/documentation/operators/combinelatest.html

基本上你可以发出A和B,然后根据函数结果返回另一个对象:

<强> RXJava1

Observable
  .combineLatest([Add here your A observable],
                 [Add here your B observable],
                 new Func2<A, B, Result>() {
                    @Override
                    public Result call(A a, B b) {
                        //Do your stuff here combining both results and return the result expected
                    }
                 })

<强> RXJava2

Observable
  .combineLatest([Add here your A observable],
                 [Add here your B observable],
                 new BiFunction<A, B, Result>() {
                    @Override
                    public Result apply(A a, B b) throws Exception {
                        //Do your stuff here combining both results and return the result expected
                    }
                 })

答案 2 :(得分:1)

Yosriz的答案是正确的,但要添加代码示例:

假设如下:

class A {}

class B {}

class AB {
    private final A a;
    private final B b;

    AB(A a, B b) {
        this.a = a;
        this.b = b;
    }
}

interface AbRepository {

    Single<A> getA();

    Single<B> getB(A a);
}

请注意,方法getB需要A作为参数。

然后你可以这样做:

abRepository.getA()
        .toObservable()
        .flatMap(new Function<A, ObservableSource<B>>() {
            @Override
            public ObservableSource<B> apply(A a) throws Exception {
                return abRepository.getB(a)
                        .toObservable();
            }
        }, new BiFunction<A, B, AB>() {
            @Override
            public AB apply(A a, B b) throws Exception {
                return new AB(a, b);
            }
        })
        .firstOrError();