繁体   English   中英

用其他 Observable 过滤 RxJava Observable

[英]Filter RxJava Observable with other Observable

我使用 RxAndroid 2.0.1 和 RxJava 2.0.6。

我有两个可观察对象:一个基于某个字符串(ID)返回Maybe<MyObject> 当返回可选对象时,我必须调用第二个接受 MyObject 实例并在对象满足某些条件时返回Single<Boolean>对象。 然后我可以对对象实例做一些进一步的操作。

我目前的实现如下:

objectDAO.getById(objectId)
    .subscribe(
        myObject -> checkCondition(myObject),
        throwable -> /* Fallback */,
        () -> /* Fallback */
    );

private void checkCondition(final MyObject myObject) {
  otherDAO.checkCondition(myObject)
    .subscribe(
        isTrue -> {
          if (isTrue) {
            // yay! now I can do what I need with myObject instance
          } else {
            /* Fallback */
          }
        },
        throwable -> /* Fallback */
    );
}

现在我想知道如何简化我的代码。 我的想法:

  1. 尝试使用zip - 我不能,因为在第一个返回 MyObject 之前无法订阅第二个 Observable

  2. 尝试使用filter - 现在的问题是我需要使用阻塞 get 来调用第二个 observable。 它可能会工作,但看起来像代码气味:

     objectDAO.getById(objectId) .filter(myObject -> otherDAO.checkCondition(myObject).blockingGet() ) .subscribe( myObject -> checkCondition(myObject), throwable -> /* Fallback */, () -> /* Fallback */ );
  3. 尝试使用flatMap - 第二个 observable 返回布尔值,而我需要返回原始对象。 因为我需要梅普的代码片段与blockingGet并返回原来的对象或Maybe.empty()

任何建议如何以代码“干净”的方式进行操作(它更小并且仍然清楚内部发生了什么)?

你可以做的一件事:

objectDAO.getById(objectId)
    .flatMapSingle(myObject -> otherDAO
        .checkCondition(myObject)
        .map(isTrue -> Pair.create(myObject, isTrue))
    )

然后你有一个Observable<Pair<MyObject, Boolean>>以及但是可以进行你想要的: subscribe直接检查Boolean那里, filter由布尔值,等等。

akarnokd 的 RxJava2Extensions额外项目有一个filterAsync转换器(与compose一起使用),它使用 any Publisher<Boolean> ;)

我想出了解决方案,而没有传递带有布尔值的 Pairs,以防有人遇到同样的问题。 例如,如果objectDAO.getById(objectId)返回Observable<T>并且otherDAO.checkCondition(myObject)返回Single<Boolean> ,我们可以这样处理过滤:

objectDAO.getById(objectId)
    .flatMap(myObject -> otherDAO
        .checkCondition(myObject)
        .toObservable()
        .filter(Boolean::booleanValue)
        .map(o -> myObject))
    .flatMapSingle(obj -> ...)

不需要的对象将被解析为Observable.empty并因此被过滤,这样只有需要的对象才会到达.flatMapSingle(obj -> ...)

基本上,同样的事情可以通过稍微更容易理解的结构来实现(不过,我发现第一个在美学上更好一些):

objectDAO.getById(objectId)
    .flatMap(myObject -> otherDAO
        .checkCondition(myObject)
        .flatMapObservable(isChecked -> isChecked ? Observable.just(myObject) : Observable.empty()))
        .flatMapSingle(obj -> ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM