FlatMapMerge、FlatMapConcat 和 FlatMapLatest 之间有什么区别?

Jac*_*s.S 12 kotlin kotlin-coroutines

我无法区分这三个运算符之间的确切区别。

文档:

这些文档链接表明两个 Flow 被平面映射到一个 Flow 对象中。我对此没有意见,但我很难理解这三个运营商之间的排放量将如何变化。

Jac*_*s.S 20

我浏览了源代码,找到了一个明智的指南,但我没有通过谷歌搜索找到。https://kotlinlang.org/docs/reference/coroutines/flow.html#flattening-flows

该指南解释了差异,但对我来说仍然有点不清楚,所以我在这里用我自己的话重写了它。

三者之间的基本区别取决于内部和外部流动对来自任一流动的新排放的反应方式。所以对于给定的代码:

val outerFlow: Flow<>
val flatMappedFlow = outerflow
        .flatMapXXXXX { innerFlow(it) }
        .collect { processFlatMapResult(it) }
Run Code Online (Sandbox Code Playgroud)

平面图连接

此运算符是连续的和成对的。一旦outerFlow发出一次,innerFlow必须在收集最终结果之前发出一次。一旦任一流发出第 N 次,另一个流必须在收集第 N 个flatMapResult之前发出第 N 次。

平面地图合并

该运营商对排放的限制最少,但可能导致排放过多。每次outerFlow发射一个值时,每个innerFlow发射都会从该值flatMapped到要收集的最终flatMapResult。最终的排放计数是innerFlow 和outerFlow 排放的乘积。

平面地图最新

该算子只关心最新的排放结果,不处理旧排放。每次outerFlow发出一个值时,它都会使用最新的innerFlow值进行flatMapped。每次innerFlow发出一个值时,它都会使用最新的outerFlow值进行flatMapped。因此,最终的排放计数是介于零和内流排放乘以外流排放之间的值。

  • `flatMapMerge` 并不能保证所有 `innerFlow` 排放都以正确的顺序收集...... (3认同)