我很难区分这三个运算符之间的确切区别。
有关以下内容的文档:

  • FlatMapMerge
  • FlatMapConcat
  • FlatMapLatest

  • 这些文档链接指示将两个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
    该运算符是顺序的和成对的。一旦externalFlow发出一次,innerFlow必须发出一次才能收集最终结果。一旦任一流发出第N次时间,另一个流必须发出第N次时间,才收集第N个flatMapResult。
    FlatMapMerge
    该操作员对排放的限制最少,但是会导致过多的排放。每次externalFlow发出一个值时,每个innerFlow发射都从该值flatMapped到要收集的最终flatMapResult中。最终排放量是innerFlow和externalFlow排放量的乘积。
    FlatMap最新
    该操作员仅关心最新的发射结果,不处理旧的发射。每当externalFlow发出一个值时,它将与最新的innerFlow值进行FlatMapped映射。每当innerFlow发出一个值时,它将与最新的externalFlow值进行FlatMapped映射。因此,最终排放计数是介于零和innerFlow排放量乘以externalFlow排放量之间的值。

    08-05 18:09