Flow 组合:24. FlatMapMerge 并发平坦化

本篇解析 example-flow-24.kt。学习如何并发地处理多个子流。

1. 核心操作符:flatMapMerge

flatMapConcat 不同,flatMapMerge并发地订阅并处理所有的子流。

特点:

  • 非顺序性:它不会等待上一个流结束才开始下一个。这意味着不同子流的发射值可能会交织在一起。
  • 高效性:它能显著提高处理速度,因为多个子流是并发运行的。
  • 并发限制:可以通过参数 concurrency 限制同时运行的子流数量(默认值为 16)。

2. 代码解析

1
2
3
(1..3).asFlow()
.flatMapMerge { requestFlow(it) } // 同时发起 1, 2, 3 的请求
.collect { println(it) }
  • 结果分析
    1. 1: First, 2: First, 3: First (几乎同时产出)。
    2. 1: Second, 2: Second, 3: Second (500ms 后几乎同时产出)。
  • 总耗时:约为单次请求的时间(600ms 左右),而不是三次串行的时间。

3. 开发者感悟

flatMapMerge 是处理“多任务并行”的神器。例如:你需要同时根据 10 个 ID 获取对应的详情数据。如果你不在乎数据的先后顺序,只在乎总时间越短越好,那么它是你的不二之选。

,