TL;DR:其他答案遗漏了一个微妙之处。如果需要等效项,请使用 ,如果需要等效项,请使用。doThingA().andThen(doThingB())
concat
doThingA().andThen(Completable.defer(() -> doThingB())
flatMap
编辑:更完整的参考
-
flatMap()
是的映射版本merge()
-
concatMap()
是的映射版本concat()
- 对于一个,你需要使函数调用像在映射函数中一样懒惰(或者最好让它在你点击订阅之前什么都不发生 - 这是一个很好的约定,用于官方Rx库以及我遇到的任何Rx扩展,对于高级用户来说,这仅指冷可操作,但大多数人可以忽略这一点)。
Completable
defer()
Single
Observable
- 和 之间的唯一区别是语法
concat(a, b)
a.andThen(b)
一些例子:
我将省略它的处理,因为它变得有点复杂,但长话短说,如果你想要“并行性”,那就是一个可以调用的。merge()
上面的答案是正确的,但我发现它们具有误导性,因为它们错过了关于热切评估的微妙之处。
doThingA().andThen(doThingB())
将立即调用,但仅订阅当可观察量返回完成时返回的可观察量。doThingB()
doThingB()
doThingA()
doThingA().andThen(Completable.defer(() -> doThingB())
只有在事情 A 完成后才会调用。doThingB()
仅当订阅事件之前有副作用时,这才重要。例如:doThingB()
Single.just(sideEffect(1)).toCompletable()
在订阅事件(真正的冷可观察对象)之前没有副作用的实现可能是 。Single.just(1).doOnSuccess(i -> sideEffect(i)).toCompletable()
在只是咬我的情况下,A是一些验证逻辑,并立即启动异步数据库更新,完成VertX ObservableFuture。这很糟糕。可以说应该编写为仅在订阅时更新数据库,并且我将尝试在将来以这种方式设计事物。doThingB()
doThingB()