【问题标题】:How to trigger Kotlin Flow sequentially and combine the result together?如何顺序触发 Kotlin Flow 并将结果组合在一起?
【发布时间】:2022-09-29 17:22:17
【问题描述】:

作为标题,我有两个流程,需要先按顺序触发它们,然后组合结果。

data class User(
    val name: String, 
    val age: Int,
)

data class UserStatus(
    val status: String, 
)

fun flow1() = flow {
    delay(300L)
    emit(User(\"Tony Stuck\", 50))
}

fun flow2(age: Int) = flow {
    val result = when {
        age > 60 -> \"Over 60\"
        age < 60 -> \"Under 60\"
        else -> \"Equal 60\"
    }
    delay(500L)
    emit(UserStatus(result))
}

// The code below isn\'t what I expected
flow1.flatMapMerge {
        flow2(it.age)
    }
    .collect {
        // here I get **UserStatus**, but I want Pair(User, UserStatus)
    }

我试过使用平面地图合并,但它最终会映射到flow2,我期望得到的是Pair(User,UserStatus),有没有更好的方法来提供这个?

    标签: android kotlin coroutine kotlin-flow


    【解决方案1】:

    您可以尝试以下方法:

    flow1.flatMapMerge { user ->
        flow2(user.age).map { userStatus ->
            user to userStatus
        }
    }.collect { pair ->
        // pair is of type Pair<User, UserStatus>
    }
    

    【讨论】:

      【解决方案2】:

      假设 flow2 是一个函数而不是一个变量,因为它看起来像是在传递一个参数,那么为什么 flow2 是一个 Flow?它只返回一件事。这更适合挂起函数或返回 Deferred 的函数。

      suspend fun getStatus(age: Int): UserStatus {
          val result = when {
              age > 60 -> "Over 60"
              age < 60 -> "Under 60"
              else -> "Equal 60"
          }
          return UserStatus(result)
      }
      
      
      flow1.map {
          it to getStatus(it)
      }
      .collect {
          // this is Pair(User, UserStatus)
      }
      

      如果你真的需要 flow2 成为一个 Flow 并且它的第一个结果是你需要的值,那么:

      flow1.map {
          it to flow2(it).first()
      }
      .collect {
          // this is Pair(User, UserStatus)
      }
      

      【讨论】:

      • 我的错,flow1 和 flow2 都是函数并返回一个流,但你的答案很好,谢谢队友
      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2021-07-15
      • 2021-06-22
      • 2021-03-26
      相关资源
      最近更新 更多