我发现大多数赞成的答案中的例子不太清楚,所以我发布了一个帮助我理解 flatMap 和 concatMap 之间区别的例子。
FlatMap 从源 observable 获取排放,然后创建新的 observable 并将其合并到原始链,而 concatMap将其连接到原始链。
主要区别在于 concatMap() 将按顺序合并每个映射的 Observable 并一次触发一个。它只会在当前调用 onComplete() 时移动到下一个 Observable。
这是flatMap示例:
private void flatMapVsConcatMap() throws InterruptedException {
Observable.just(5, 2, 4, 1)
.flatMap(
second ->
Observable.just("Emit delayed with " + second + " second")
.delay(second, TimeUnit.SECONDS)
)
.subscribe(
System.out::println,
Throwable::printStackTrace
);
Thread.sleep(15_000);
}
将导致:
发射延迟 1 秒
发射延迟 2 秒
发射延迟 4 秒
发射延迟 5 秒
这是concatMap示例:
private void flatMapVsConcatMap() throws InterruptedException {
Observable.just(5, 2, 4, 1)
.concatMap(
second ->
Observable.just("Emit delayed with " + second + " second")
.delay(second, TimeUnit.SECONDS)
)
.subscribe(
System.out::println,
Throwable::printStackTrace
);
Thread.sleep(15_000);
}
将导致:
发射延迟 5 秒
发射延迟 2 秒
发射延迟 4 秒
发射延迟 1 秒
注意使用 Thread.sleep()因为delay()默认在计算调度器上运行