RxJava合并不同类型的可观测对象

48

我刚开始学习rxjava。我需要将发出不同类型对象的两个observables组合起来。类似于Observable<Milk>Observable<Cereals> 并得到一个 Observable<CerealsWithMilk>。我找不到适用于这种情况的任何操作符。使用rx要怎么做?请注意,MilkCereals是异步的。

2个回答

79

如果不知道您确切需要什么,很难说,但可能是 zip()combineLatest()

zip 将接受 Observable<Milk>Observable<Cereals> 并让您通过提供的函数将它们组合成 CerealsWithMilk。每当您同时获取到一个 Milk 和一个 Cereals 时,都会发出一个新的 CerealsWithMilk

combineLatest 类似于 zip,除了它即使只有一个新的 Milk 或只有一个新的 Cereals 被发出,也会发出新的 CerealsWithMilk


3
注意 - (只要每个源Observable都至少发出了一个项)。 - LEO
1
当使用 zip 操作符时,问题在于可观察结果互相等待。实际上,我想要的是尽快使用已完成的 Observable。combineLatest 操作符能满足我的需求吗? - Olkunmustafa

9

如果你想合并不同类型的 observable,你需要使用 Observable.zip

Observable<String> o1 = Observable.just("a", "b", "c");
Observable<Integer> o2 = Observable.just(1, 2, 3);
Observable<String> result = Observable.zip(o1, o2, (a, b) -> a + b);

result 将是一个可观察对象,将 (a, b) -> a + b 应用于 o1o2 的项。因此,生成一个可观察的结果,产生 "a1", "b2", "c3"

您可以使用任何函数。例如

    Observable<String> o1 = Observable.just("a", "b", "c");
    Observable<Integer> o2 = Observable.just(1, 2, 3);
    Observable<String> result = Observable.zip(o1, o2, (a, b) -> myFunc(a, b));
    //...

    private String myFunc(String a, Integer b) {
            //your code here
            return someString;
        }

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