我有一个Observable,当某些数据来自BLE连接时会发出项目:
public interface CommunicationController {
Flowable<DataContainer> dataReceived();
}
在此之上,我想构建一个Observable
,当满足以下条件之一为completes
时:
a。我收到两条特定类型的消息(这是通过对收到的filter
项目使用DataContainer
运算符来完成的。
communicationController.dataReceived()
.filter(data -> isTypeA(data) || isTypeB(data))
.take(2)
.toList()
.map(dataContainers -> doSomeMappingToCommon object)
b。我收到一条特定类型的消息(再次使用filter
运算符)。
communicationController.dataReceived()
.filter(data -> isTypeC(data))
.firstOrError()
.map(dataContainers -> doSomeMappingToCommon object);
如何将这两个Observable
合并为一个?
此外,这两个Observable中只有一个会发射一个项目。
答案 0 :(得分:3)
我认为您的回答将是可观察的。合并:http://reactivex.io/documentation/operators/merge.html
根据文档,这并不等待每个可观察到的东西发出。
一种选择是使用merge and takeUntil:http://reactivex.io/documentation/operators/takeuntil.html
科特琳代码:
val stopStream = Observable.merge(...)
streamThatWillRun = streamThatWillRun.takeUntil(stopStream)
答案 1 :(得分:0)
要合并2个可观察值,可以使用运算符zipWith。示例:
Observable<AppMetaDataBiz> appMetaDataObservable = this.mAppRepository.getAppMetaData();
Observable<ProductBiz> productDetailsObservable =
this.mProductRepository.getProductDetails(this.productId);
return productDetailsObservable.zipWith(appMetaDataObservable,
((jmProduct, jmAppMetaData) -> {
//TODO: implement business logic
return jmProduct;
}));