RxJava在过滤器后组合多个观察者

RxJava在过滤器后组合多个观察者,java,rx-java,observable,rx-java2,Java,Rx Java,Observable,Rx Java2,以下是我目前的代码 private final List<Disposable> subscriptions = new ArrayList<>(); for (Instrument instrument : instruments) { // Waiting for OrderBook to generate Reliable results. GenericBook Book = service .ge

以下是我目前的代码

  private final List<Disposable> subscriptions = new ArrayList<>();

  for (Instrument instrument : instruments) {
    // Waiting for OrderBook to generate Reliable results.
    GenericBook Book =
        service
            .getBook(instrument.getData())
            .filter(gob -> onBookUpdate(gob))
            .blockingFirst();

    subscriptions.add(
        service
            .getBook(instrument.getData())
            .subscribe(
                gob -> {
                  try {
                    onBookUpdate(gob);
                  } catch (Exception e) {
                    logger.error("Error on subscription:", e);
                  }
                },
                e -> logger.error("Error on subscription:", e)));
  }

当使用可观察物等时,一个人应该全心全意地接受它们。拥抱的前提之一是将管道的配置和构造与其执行分开

换句话说,预先配置管道,然后在数据可用时通过管道发送数据

此外,接受可观测值意味着避免循环

我不是100%了解您的用例,但我建议您创建一个管道,将一个工具作为输入并返回订阅

大概是

service.getBook(instrument.getData())
 .flatMap(gob -> {
   onBookUpdate(gob);
   return gob;
});
这将返回一个
可观察的
,您可以订阅它并将结果添加到订阅中

然后创建一个可观察的种子,将仪器对象泵入其中


不确定API的某些细节,如果不清楚或我的假设错误,请与我联系。

我假设
instruments
是一个列表。如果是,那么你可以这样做

Observable
    .fromIterable(instruments)
    // Returns item from instrument list one by one and passes it to getBook()
    .flatmap(
        instrument -> getBook(instrument.getData())
    )
    .filter(
        gob -> onBookUpdate(gob)
    )
    // onComplete will be called if no items from filter 
    .switchIfEmpty(Observable.empty())
    .subscribe(
        onBookUpdateResponse -> // Do what you want,
        error -> new Throwable(error)
    );
希望这有帮助

Observable
    .fromIterable(instruments)
    // Returns item from instrument list one by one and passes it to getBook()
    .flatmap(
        instrument -> getBook(instrument.getData())
    )
    .filter(
        gob -> onBookUpdate(gob)
    )
    // onComplete will be called if no items from filter 
    .switchIfEmpty(Observable.empty())
    .subscribe(
        onBookUpdateResponse -> // Do what you want,
        error -> new Throwable(error)
    );