Rx java 仅当第一个触发时,组合2个观测值

Rx java 仅当第一个触发时,组合2个观测值,rx-java,rx-android,rx-java2,reactivex,Rx Java,Rx Android,Rx Java2,Reactivex,我是Rx的新手,我遇到了一种情况,我没有找到任何关于它的信息,或者我没有提出正确的问题。 我有一个可观察的,应该触发一个特定的方法。然而,要调用该方法,我需要来自第二个可观测值的值,顺便说一句,该值总是在第一个之前。如何将这两者结合起来,使该方法仅在第一个可观察到的触发时才被调用?这与CombineTest类似,但如果任何一个可观察到的对象发生火灾,则会发生火灾。 比尔, Daniel如果我正确理解了这个问题,您可以使用withLatestFrom操作符,这样组合和随后的发射将由第一个可观测值选

我是Rx的新手,我遇到了一种情况,我没有找到任何关于它的信息,或者我没有提出正确的问题。 我有一个可观察的,应该触发一个特定的方法。然而,要调用该方法,我需要来自第二个可观测值的值,顺便说一句,该值总是在第一个之前。如何将这两者结合起来,使该方法仅在第一个可观察到的触发时才被调用?这与CombineTest类似,但如果任何一个可观察到的对象发生火灾,则会发生火灾。 比尔,
Daniel

如果我正确理解了这个问题,您可以使用withLatestFrom操作符,这样组合和随后的发射将由第一个可观测值选通

与最新版本合并在同一页上:
这很简单。您只需在第一个可观察对象完成后调用另一个可观察对象,或者如果第二个可观察对象依赖于第一个可观察对象的连续数据接收,您需要在onNext中调用第二个可观察对象

下面的代码试图说明可观察代码的最终外观。我还没有检查语法等方面的错误,所以使用下面的代码来阐述一个想法

Observable.just(getDataFromServer())
          .subscribeWith(new DisposableObserver() {
            ArrayList<MyData> dataList = new ArrayList<>();
            public void onNext(MyData d) {
                // call second observable here if it relies on batches of data the first observable has
                   dataList.add(d);
            }

            public void onComplete() {
               Observable.from(dataList).map(new Func1<MyData, String>() {
                  @Override public String call(MyData data) {
                       // apply your operations etc
                  }
              });
            }
});

您可以使用Flatmap执行相同的操作 如果您使用的是java 8,则:

Observable.just(function1()).flatMap( dataFromFirstObservable-> 
        Observable.just(function2(dataFromFirstObservable))
    ).subscribe(resultFromSecondObservable -> {
        //perform action here
    });
如果使用Java7

Observable.just(getData1()).flatMap(new Function<Integer, ObservableSource<?>>() {
        @Override
        public ObservableSource<?> apply(Integer integer) throws Exception {
            return Observable.just(function2(integer));
        }
    }).subscribe(new Consumer<Object>() {
        @Override
        public void accept(Object o) throws Exception {
            //perform action here
        }
    });