flatMapMerge是否会缓存Flow?对应代码运行逻辑疑问
Kotlin Flow flatMapMerge 工作原理解答
问题直接回复
- 问题1:
flatMapMerge不会重新调用(1..3).asFlow()方法,上游流只会执行一次,按预设逻辑依次发射1、2、3三个元素 - 问题2:是的,
flatMapMerge的核心特性就是并发收集所有生成的内部requestFlow,不需要等待前一个内部流执行完成,就可以处理下一个上游元素,所有未执行完的内部流都会被持续监听直到执行结束。
执行时序拆解
你的代码输出完全符合flatMapMerge的并发合并规则,具体运行过程如下:
- 上游流
(1..3).asFlow().onEach { delay(100) }启动,每间隔100ms依次发射1、2、3三个整数 - 收到第一个元素
1时,flatMapMerge立刻启动收集requestFlow(1):- 首先发射
1: First,对应输出里136ms的结果 - 之后
requestFlow(1)进入500ms休眠,不会阻塞后续上游元素的处理
- 首先发射
- 间隔100ms后收到上游元素
2,flatMapMerge同时启动收集requestFlow(2):- 立即发射
2: First,对应输出里231ms的结果 requestFlow(2)进入500ms休眠
- 立即发射
- 再间隔100ms收到上游元素
3,flatMapMerge同时启动收集requestFlow(3):- 立即发射
3: First,对应输出里333ms的结果 requestFlow(3)进入500ms休眠
- 立即发射
- 三个内部流的休眠陆续到期,按各自启动的时间顺序依次发射
Second结果:requestFlow(1)先结束500ms休眠,发射1: Second,对应输出里639ms的结果- 间隔100ms后
requestFlow(2)休眠结束,输出2: Second - 再间隔100ms
requestFlow(3)休眠结束,输出3: Second
flatMapMerge 核心逻辑说明
flatMapMerge的本质是:对上游发射的每一个元素,调用传入的转换函数生成一个新的内部流,默认最多同时并发收集16个内部流,所有内部流的发射结果会按实际发射时间顺序直接合并到下游,既不会等待前一个内部流执行完成,也不会重新触发上游流的执行。
内容的提问来源于stack exchange,提问作者ntos
相关产品推荐
相关产品推荐

