用其他Observable过滤RxJava Observable

LR8*_*R89 5 java android rx-java rx-android rx-java2

我正在使用RxAndroid 2.0.1和RxJava 2.0.6。

我有两个观察值:一个Maybe<MyObject>基于某些字符串(ID)的返回。当返回可选对象时,我必须调用第二个对象,该对象采用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 */
    );
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 尝试使用zip-我不能这样做,因为直到第一个Observable返回MyObject之前,第二个Observable才能被订阅

  2. 尝试使用filter-现在的问题是,我需要使用阻塞获取来调用第二个可观察的对象。它可以正常工作,但看起来像代码气味:

    objectDAO.getById(objectId)
      .filter(myObject ->
        otherDAO.checkCondition(myObject).blockingGet()
      )
      .subscribe(
          myObject -> checkCondition(myObject),
          throwable -> /* Fallback */,
          () -> /* Fallback */
      );
    
    Run Code Online (Sandbox Code Playgroud)
  3. 尝试使用flatMap-当我需要返回原始对象时,第二个observable返回Boolean。因此,我需要映射一个代码段blockingGet并返回原始对象或Maybe.empty()

有任何建议如何以使代码“干净”(更小并且仍然清楚内部正在发生什么)的方式进行处理?

dav*_*ola 5

您可以做的一件事:

objectDAO.getById(objectId)
    .flatMapSingle(myObject -> otherDAO
        .checkCondition(myObject)
        .map(isTrue -> Pair.create(myObject, isTrue))
    )
Run Code Online (Sandbox Code Playgroud)

然后,您可以按Observable<Pair<MyObject, Boolean>>自己的意愿进行操作,然后进行:subscribe直接检查Booleanfilter通过布尔值等检查该位置。