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
相关推荐
pengyu12 小时前
【Kotlin 协程修仙录 · 渡劫境 · 中阶】 | 造化神兵:自定义 CoroutineDispatcher 与调度器的终极定制
android·kotlin
pengyu12 小时前
【Kotlin 协程修仙录 · 渡劫境 · 初阶】 | 飞升雷劫:CPS 变换与挂起函数字节码终极透视
android·kotlin
hunterandroid18 小时前
Android 多渠道打包与 Gradle 构建优化实战
android·前端·kotlin
pengyu20 小时前
【Kotlin 协程修仙录 · 大乘境 · 后阶】 | 死锁天劫:协程同步原语与 ThreadLocal 迁移之道
android·kotlin
天空之城--21 小时前
过去一周Android行业动态:编码技术与综合趋势精选
android·flutter·性能优化·kotlin·android jetpack
海兰2 天前
【 Python 量化交易】第10章:八大经典策略
android·python·kotlin
JMchen1232 天前
【Android 性能优化实战 60 讲】04 Memory Profiler 高阶玩法:深剖堆内存原理,实战定位 Kotlin 闭包隐式泄漏
android·性能优化·kotlin·实战·源码分析·内存泄漏·memory profiler
Kapaseker2 天前
我为什么喜欢 Compose ?
android·kotlin
limuyang22 天前
PDF Viewer KMP(基于 chrome 的 PDFium 内核)
android·kotlin
pengyu2 天前
【Kotlin 协程修仙录 · 大乘境 · 初阶】 | 跳出三界:协程在 KMP 与后端开发中的跨平台之道
android·kotlin