RxJava / Android:组合两个依赖的Observable的结果

时间:2016-04-15 06:11:16

标签: java android rx-java reactive-programming rx-android

我有两个Observables

  1. Observable<A> getAObservable()返回A
  2. 的Observable
  3. Observable<B> getBObservable(A)返回&#39; B&#39;。
  4. 的观察结果

    此处Observable<A>应在Observable<B>之前执行,以便它可以将结果A传递给getBObservable()方法。现在Observable<B>完成后,我需要合并这些observableObservable<AB>的结果。

    尝试的选项:

    1. Observable<A>并在其上应用flatMap以便进行转换 结果为B。现在,此时我无法访问A数据。 因此,我无法返回Observable

      1. 我可以使用zip,这样一旦我得到Observable<A>Observable<B>的结果,我就可以将结果与 AB。但在这里我无法设置Observable<A>应该具有的依赖性 在Observable<B>之前执行,我无法通过结果 Observable<A>Observable<B>
    2. 代码库:

      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) {
      
              }
          }
      
      }
      

1 个答案:

答案 0 :(得分:6)

flatMap documentation。它有重载方法,应用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);
            }
        }
      );