RxJava/Android: 结合两个相关的Observables的结果

11

我有两个Observables

  1. Observable<A> getAObservable() 返回类型为 A 的 Observable。
  2. Observable<B> getBObservable(A) 返回类型为 'B' 的 Observable。

在这里,Observable<A> 应该在 Observable<B> 之前执行,以便可以将其结果 A 传递给 getBObservable() 方法。现在,一旦 Observable<B> 完成,我需要合并这些 observable 的结果,并返回一个 Observable<AB>

尝试的选项:

  1. 获取 Observable<A> 并在其上应用 flatMap,以使其转换为 B 的结果。但此时我无法访问 A 数据,因此不能返回 Observable。

  2. 我可以使用 zip,以便一旦获得了 Observable<A>Observable<B> 的结果,就可以将它们的结果组合成 AB。但是,我无法设置 Observable<A> 应该在 Observable<B> 之前执行的依赖关系,也无法将 Observable<A> 的结果传递给 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) {

        }
    }

}

flatMap 应该是正确的方式。请展示您使用 flatMap 的方法。您只需要从中返回 Observable<AB> 而不是 Observable<B> 即可。 - Michał Klimczak
@Michal:谢谢回复。我用了flatMap做到了这一点。但是代码看起来不太好。除了使用flatMap之外,还有其他选项吗?请回复。 - Sagar Trehan
1个回答

6

请查看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);
            }
        }
      );

谢谢你的回复。我正在尝试在我的端口上运行它。我不熟悉 lambda 表达式,能否请您在不使用 lambda 表达式的情况下发布它。那太好了。谢谢 - Sagar Trehan
感谢您更新答案。它返回Observable<Pair<A, B>>,但我想要Observable<AB>。再次打扰很抱歉,我对RxJava不是很熟悉,但我想学习。请帮忙。 - Sagar Trehan
@SagarTrehan 只需将 Pair<A,B> 替换为您的类,非常简单 :) - zella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接