使用混合 Maybe 和 Single 时如何避免嵌套订阅

How to avoid nested subscribe when working with mixed Maybe and Single

我交叉了以下需求:

我有一个 returns Maybe 的方法,我需要尽快处理它,如果它 returns 某些东西然后调用另一个方法 returns Single,否则在 OnComplete 调用 Single.

这是一个片段:

 doSomethingThatReturnsMaybe()
 .flatMapSingleElement(obj-> {
     return doSomethingThatReturnsSingle();
 })
 .subscribe(obj -> LOG.info(obj),
  err -> LOG.err("", err),
  () -> {
     doSomethingThatReturnsSingle()
     .subscribe();
  });

知道如何摆脱嵌套的 subscribe 吗?

更新: 最新代码片段

doSomethingThatReturnsMaybe()
  .flatMapSingleElement(obj-> {
    return doSomethingThatReturnsSingle();
  })
  .switchIfEmpty(doSomethingElseThatReturnsSingle())
  .subscribe(obj -> LOG.info(obj),
         err -> LOG.err("", err);

经过评论的讨论,我觉得这可能是一个解决方案。

我会在这里使用 switchIfEmpty

类似于:

doSomethingThatReturnsMaybe()
  .flatMapSingleElement(obj-> {
    return doSomethingThatReturnsSingle();
  })
  .switchIfEmpty(doSomethingThatReturnsSingle())
  .subscribe(obj -> LOG.info(obj),
             err -> LOG.err("", err);

switchIfEmpty 将在 Maybe returns 为空时执行。请注意,这与您拥有的不同。你所执行的 doSomethingThatReturnsSingle() 两次。这个新示例执行一次。如果可能 returns 为空,switchIfEmpty 将 运行 它一次,否则,它 运行 在 flatMapSingleElement 上。之前流完成后也是 运行ning。

如果我理解正确,那么在这两种情况下(无论 Maybe 是否为空),你都想调用 doSomethingThatReturnsSingle()。如果是这样,下面的代码可能会有所帮助,

doSomethingThatReturnsMaybe().isEmpty()
                             .flatMap(isEmpty-> doSomethingThatReturnsSingle())
                             .subscribe(obj-> System.out.println(obj));