RxJava:根据条件完成流

时间:2018-11-08 09:34:07

标签: android rx-java2

我有一个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中只有一个会发射一个项目。

2 个答案:

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