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

时间:2019-01-28 18:50:03

标签: rx-java rx-java2

我遇到了以下要求:

我有一个返回Maybe的方法,我需要对其进行处理,如果它返回某些东西,则调用另一个返回Single的方法,否则在OnComplete上调用{ {1}}。

这是一个代码段:

Single

有什么想法可以摆脱嵌套的 doSomethingThatReturnsMaybe() .flatMapSingleElement(obj-> { return doSomethingThatReturnsSingle(); }) .subscribe(obj -> LOG.info(obj), err -> LOG.err("", err), () -> { doSomethingThatReturnsSingle() .subscribe(); }); 吗?

更新: 最新的代码段

subscribe

2 个答案:

答案 0 :(得分:1)

在对评论进行讨论之后,我觉得这可能是一个解决方案。

我会在这里使用switchIfEmpty

类似的东西:

doSomethingThatReturnsMaybe()
  .flatMapSingleElement(obj-> {
    return doSomethingThatReturnsSingle();
  })
  .switchIfEmpty(doSomethingThatReturnsSingle())
  .subscribe(obj -> LOG.info(obj),
             err -> LOG.err("", err);
如果switchIfEmpty返回空,将执行

Maybe。请注意,这与您所拥有的有所不同。您执行过两次doSomethingThatReturnsSingle()。这个新示例执行一次。如果may返回空,则switchIfEmpty将运行一次,否则,它将在flatMapSingleElement上运行。流运行完成之前,它还没有运行。

答案 1 :(得分:0)

如果我正确理解它,那么在两种情况下(无论是否为空),您都希望致电doSomethingThatReturnsSingle()。如果是这样,下面的代码可能会有所帮助,

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