首页 文章

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

提问于
浏览
5

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

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

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

任何帮助都感激不尽!

2 回答

  • 0

    当您只有第一个参数的数据时,您不能真正应用相同的3参数函数,但您可以使用sentinel值来告诉函数参数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));
    }
    
  • 1

    您可以使用 Observable.combineLatest() 而不是 zip() 并将 .startWith() 添加到可以"null"不发射任何内容的Observables . 所以在你的情况下,它会像:

    Observable.combineLatest(
        data1, 
        data2.startWith(/*some value*/),
        data3.startWith(/*some value*/),
        new Func3<SomeData, SomeData, SomeData, SomeData>() {
            @Override
            public SomeData call(
                final SomeData d1,
                final SomeData d2,
                final SomeData d3) {
                    //do something and return SomeData
            }
        });
    

相关问题