如果只存在一个Observable参数,如何使用RxJava Observable.zip

Gre*_* Ho 5 android reactive-programming observable rx-java

H,

对不起,我是RxJava的新手,对如何使用rx.Observable有疑问.

这是我的代码

final Observable<SomeData> data1 =
         getData(...);
final Observable<SomeData> data2 =
         getData(...);                    
final Observable<SomeData> data3 =
         getData(...);

            return Observable.zip(
                    data1,
                    data2,
                    data3,
                    new Func3<SomeData, SomeData, SomeData, SomeData>() {
                        @Override
                        public SomeData call(
                                final SomeData d1,
                                final SomeData d2,
                                final SomeData d3) {
                            //do something and return SomeData
                        }
                    });
Run Code Online (Sandbox Code Playgroud)

这里我在所有数据存在时使用zip.

我的问题是如果data2和data3不存在(即它们都是null),我不会/不应该使用Observable.zip来发出函数并获取返回的值,所以当我只做时我该怎么办有数据1?如果我只使用一个参数(data1),我应该使用哪个API?此外,我将不得不从函数返回SomeData而不是Observable.

任何帮助都感激不尽!

aka*_*okd 1

当您只有第一个参数的数据时,您无法真正应用相同的 3 参数函数,但您可以使用标记值来告诉函数参数 2 和 3 没有数据:

static final SomeData NOT_PRESENT = new SomeData(null, ...); 

void Observable<OutputType> process(Observable<SomeData> data1,
       Observable<SomeData> data2, Observable<SomeDatat> data3) {
    Func3<SomeData, SomeData, SomeData, OutputType> f3 = (a, b, c) -> {

        if (b == NOT_PRESENT) {
        }
        // process the data and return an OutputType
        return ...
    };

    if (data2 != null && data3 != null) {
        return Observable.zip(data1, data2, data3, f3);
    }

    return data1.map(v -> f3.call(v, NOT_PRESENT, NOT_PRESENT));
}
Run Code Online (Sandbox Code Playgroud)