Kotlin Flow 操作符 map 和 flatMap 的区别

Kotlin Flow 操作符 map 和 flatMap 的区别

  • map:对 Flow 中的每个元素应用一个转换函数,每个元素转换为一个新的元素,然后生成一个新 Flow
  • flatMap:对 Flow 中的每个元素应用一个转换函数,每个元素转换为一个新的 Flow,然后将所有 Flow 合并成一个 Flow

map

  • 转换后的 Flow 元素数量与原 Flow 相同,顺序保持一致
  • 应用场景:比如数值计算、数据格式化等
kotlin 复制代码
flowOf(1, 2, 3)
  .map { it * 2 }
  .collect { 
   println(it) 
  }
//--------- 打印 ---------
//2
//4
//6
kotlin 复制代码
flowOf(listOf(1, 2), listOf(3, 4))
  .map { it } //List<Int>
  .collect { println(it) }
//--------- 打印 ---------
//[1, 2]
//[3, 4]

flatMap

  • flatMap 的转换函数必须返回 Flow<R>
  • 应用场景:比如组合异步操作(需要针对每个值触发异步操作,比如 API 网络请求)的场景、展平嵌套数据结构(需要合并多个子 Flow)等
  • flatMap 根据合并方式不同,分成 flatMapConcat、flatMapMerge 和 flatMapLatest,而 flatMap 默认就是 flatMapConcat
  • flatMapConcat:串行(连接)合并,按顺序依次处理执行子 Flow,结果按顺序输出(比如串行化任务)
  • flatMapMerge:并行合并,并行处理子 Flow,最终合并所有结果,因此结果输出的顺序可能会有所不同(比如并行下载)
  • flatMapLatest:取消前一个未完成的子 Flow 的处理操作,仅保留最新的子 Flow 的结果(比如输入框实时输入的搜索请求,可以及时取消过期请求)
kotlin 复制代码
fun getToken(): Flow<String> = flow { emit("token") }
fun getUserInfo(token: String): Flow<UserInfo> = flow { emit(UserInfo(token)) }

getToken()
  .flatMapConcat { token ->
    //
    getUserInfo(token)
  }
  .collect { userInfo -> println("UserInfo: $userInfo") }
kotlin 复制代码
//展平为单一 Flow
flowOf(listOf(1, 2), listOf(3, 4))
  .flatMapConcat { it.asFlow() } //子 Flow
  .collect { println(it) }
//--------- 打印 ---------
//1
//2
//3
//4
相关推荐
哲科软件3 小时前
跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议
android·flutter·kotlin
移动开发者1号18 小时前
Android 同步屏障(SyncBarrier)深度解析与应用实战
android·kotlin
移动开发者1号18 小时前
深入协程调试:协程调试工具与实战
android·kotlin
fundroid1 天前
Kotlin 协程:Channel 与 Flow 深度对比及 Channel 使用指南
android·kotlin·协程
移动开发者1号2 天前
深入理解原子类与CAS无锁编程:原理、实战与优化
android·kotlin
移动开发者1号2 天前
深入理解 ThreadLocal:原理、实战与优化指南
android·kotlin
Devil枫2 天前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer2 天前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin
每次的天空2 天前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
移动开发者1号3 天前
使用 Android App Bundle 极致压缩应用体积
android·kotlin