【发布时间】:2020-07-09 07:55:52
【问题描述】:
我很难区分这三个运算符之间的确切区别。
文档:
这些文档链接表明两个 Flow 被平面映射到一个 Flow 对象中。我对此很好,但我很难理解这三个运营商之间的排放量会如何变化。
【问题讨论】:
我很难区分这三个运算符之间的确切区别。
文档:
这些文档链接表明两个 Flow 被平面映射到一个 Flow 对象中。我对此很好,但我很难理解这三个运营商之间的排放量会如何变化。
【问题讨论】:
我浏览了源代码,发现了一个我没有通过谷歌搜索找到的合理指南。 https://kotlinlang.org/docs/reference/coroutines/flow.html#flattening-flows
该指南解释了差异,但我还是有点不清楚,所以我在这里用我自己的话重写了它。
三者之间的基本区别取决于内流和外流对来自任一流的新排放物的反应方式。所以对于给定的代码:
val outerFlow: Flow<>
val flatMappedFlow = outerflow
.flatMapXXXXX { innerFlow(it) }
.collect { processFlatMapResult(it) }
FlatMapConcat
此运算符是顺序的和成对的。一旦 outerFlow 发出一次,innerFlow 必须在收集最终结果之前发出一次。一旦任一流第 N 次发出,另一个流必须在第 N 次 flatMapResult 被收集之前发出第 N 次。
FlatMapMerge
此运算符对排放的限制最少,但可能导致排放过多。每次 outerFlow 发出一个值时,每个 innerFlow 发射都会从该值 flatMapped 到要收集的最终 flatMapResult 中。最终排放计数是 innerFlow 和 outerFlow 排放的乘积。
FlatMapLatest
此操作员只关心最新的排放结果,不处理旧的排放。每次 outerFlow 发出一个值时,它都会与最新的 innerFlow 值进行平面映射。每次 innerFlow 发出一个值时,它都会与最新的 outerFlow 值进行 flatMapped。因此,最终排放计数是介于零和 innerFlow 排放乘以 outerFlow 排放之间的值。
【讨论】:
flatMapMerge不保证所有innerFlow 排放都以正确的顺序收集...