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