本篇解析 example-flow-24.kt。学习如何并发地处理多个子流。
1. 核心操作符:flatMapMerge
与 flatMapConcat 不同,flatMapMerge 会并发地订阅并处理所有的子流。
特点:
- 非顺序性:它不会等待上一个流结束才开始下一个。这意味着不同子流的发射值可能会交织在一起。
- 高效性:它能显著提高处理速度,因为多个子流是并发运行的。
- 并发限制:可以通过参数
concurrency限制同时运行的子流数量(默认值为 16)。
2. 代码解析
1 | (1..3).asFlow() |
- 结果分析:
- 1: First, 2: First, 3: First (几乎同时产出)。
- 1: Second, 2: Second, 3: Second (500ms 后几乎同时产出)。
- 总耗时:约为单次请求的时间(600ms 左右),而不是三次串行的时间。
3. 开发者感悟
flatMapMerge 是处理“多任务并行”的神器。例如:你需要同时根据 10 个 ID 获取对应的详情数据。如果你不在乎数据的先后顺序,只在乎总时间越短越好,那么它是你的不二之选。