
协程把"异步"这件事讲清楚了,Flow 解决的是另一个维度:异步数据流。上一节收在异常处理,本节开始一个新主题:为什么需要 Flow、它和 RxJava 的 Flowable 差在哪、冷流为什么"有订阅才生产"、以及collect与"直接在协程里 while 循环读队列"到底差在哪里。这题常被当成热身,但面试官往往在最后一句追问里放一个能筛掉人的问题:同一个 Flow 连续 collect 两次会怎样。先把结论放在前面:Flow 是冷流 + 一对一发射 + 结构化协作三件事的组合。冷流意味着每个收集者都独立触发一次上游生产(和热流相对);一对一意味着collect是suspend函数、发射不能并发;结构化意味着 Flow 的收集受收集者所在协程的取消与作用域约束。把这三条讲清,Flow 的坑位就基本定了。机制拆解flow { }构造的是一个对象,不是数据。这个对象里装着一个FlowCollectorT类型的 lambda,只有在有人collect时才被调用。这就是"冷流"的含义所在——生产是被消费驱动的,不是被创建驱动的。顺着这条路径看,对比"直接 while 循环读队列"就清楚了:// 传统写法:自己管队列、自己管唤醒、自己管结束标志 while (isActive) { val item = queue.