RxJava/Android: объединить результат двух зависимых Observables

У меня два Observables.

  1. Observable<A> getAObservable() Возвращает Observable of A
  2. Observable<B> getBObservable(A) Возвращает Observable из 'B'.

Здесь Observable<A> должен выполняться перед Observable<B>, чтобы он мог передать свой результат A в метод getBObservable(). Теперь, когда Observable<B> завершится, мне нужно объединить результаты этих observable и Observable<AB> должны возвращаться.

Пробовал варианты:

  1. Возьмите Observable<A> и примените к нему flatMap, чтобы он преобразовал результат в B. На данный момент у меня нет доступа к данным A. Следовательно, я не могу вернуть Observable

    1. I can use zip so that once I get the result of both Observable<A> and Observable<B>, I can combine their result to AB. But here I cannot set dependency that Observable<A> should execute before Observable<B> and I can't pass the result of Observable<A> to Observable<B>

Кодовая база:

public class Data {

    A a = new A();
    public Observable<AB> getABContext() {
        A a = new A();

        return getAObservable()
                .flatMap(new Func1<A, Observable<AB>>() {
                    @Override
                    public Observable<AB> call(final A a) {
                        return getBObservable(a)
                                .flatMap(new Func1<B, Observable<AB>>() {
                                    @Override
                                    public Observable<AB> call(B b) {
                                        return Observable.just(new AB(a, b));
                                    }
                                });
                    }
                });
    }

    private Observable<A> getAObservable() {
        return Observable.just(a);
    }

    private Observable<B> getBObservable(A a) {
        return Observable.just(new B(a));
    }

    private static class A {

    }

    private static class B {
        B (A a) {

        }
    }

    private static class AB {
        AB (A a, B b) {

        }
    }

}

person Sagar Trehan    schedule 15.04.2016    source источник
comment
flatMap должен быть правильным способом. Покажите, как вы используете flatMap, пожалуйста. Вам просто нужно вернуть из него Observable‹AB› вместо Observable‹B›.   -  person Michał Klimczak    schedule 15.04.2016
comment
@Michal: Спасибо за ответ, я сделал это с помощью flatMap. Но код выглядит не очень хорошо. Есть ли другой вариант, кроме использования flatMap. ответьте, пожалуйста   -  person Sagar Trehan    schedule 15.04.2016


Ответы (1)


См. flatMap документацию. Он имеет перегруженный метод, применяющий функцию zip:

    Observable<Pair<A, B>> abObservable = getAObservable()
      .flatMap(
        new Func1<A, Observable<? extends B>>() {
            @Override
            public Observable<? extends B> call(A a) {
                return getBObservable(a);
            }
        },
        new Func2<A, B, Pair<A, B>>() {
            @Override
            public Pair<A, B> call(A a1, B b1) {
                return new Pair<>(a1, b1);
            }
        }
      );
person zella    schedule 15.04.2016
comment
Спасибо за ответ. Я пробую это на своем конце. Я не знаком с лямбда-выражением, не могли бы вы опубликовать его без использования лямбда-выражения. Было бы здорово. Спасибо - person Sagar Trehan; 15.04.2016
comment
Спасибо за обновление ответа. Он возвращает Observable‹Pair‹A, B››, но я хочу Observable‹AB›. Извините, что снова беспокою вас, я не очень хорошо знаком с RxJava, но я хочу научиться. Пожалуйста помоги. - person Sagar Trehan; 15.04.2016
comment
@SagarTrehan просто замените Pair‹A,B› своим классом, это очень просто :) - person zella; 15.04.2016