当前位置: 首页 > news >正文

Kotlin流操作符简介

1. 启动操作符

1.1. collect启动流并处理值

lifecycleScope.launch {    flow.collect { value ->         // 处理值    }}

1.2. launchIn在指定作用域中异步启动流

flow.onEach { updateUI(it) }    .launchIn(viewModelScope)

2. 共享操作符

2.1. stateIn转换为状态流

flow.stateIn(    scope = viewModelScope,    started = SharingStarted.WhileSubscribed(5000), // 5秒保活    initialValue = null)

2.2. shareIn转换为共享流

flow.shareIn(    scope = coroutineScope,    started = SharingStarted.WhileSubscribed,    replay = 1 // 新订阅者接收最近1个值)

3. 单次取值操作符

3.1. first取首个值

val result = flow.first() // 对空流抛出NoSuchElementException

3.2. firstOrNull取首个值或null

val result = flow.firstOrNull() // 对空流安全

3.3. toList/toSet 收集全部值并转换为集合

4. 聚合操作符

4.1. fold带初始值的累积计算

val sum = flow.fold(0) { acc, value -> acc + value }

4.2. reduce无初始值累积

val sum = flowOf(1, 2, 3, 4).reduce { accumulator, value ->    accumulator + value // 累积求和 (结果为10)}

5. 转换与组合操作符

5.1. transform转换值

flowOf(1, 2).transform { emit(it * 2); emit(it + 1) } // 输出:2, 3, 4, 5

5.2. flatMapMerge合并、转换并展平

flowOf(1, 2).flatMapMerge { flowOf(it, it * 2) }

5.3. flatMapLatest转换并展平最新流(取消前序未完成转换)

flowOf(1, 2).flatMapLatest { flowOf(it, it * 2) }

5.4. combine合并多个流的最新值

flow1.combine(flow2) { a, b -> "a-b" }

6. 时间处理操作符

6.1. debounce防抖

flow { emit(1); delay(100); emit(2) }.debounce(200) 

6.2. sample定时采样最新值

flow { while(true) emit("弹幕") }.sample(1000)

7. 错误处理与资源管理

7.1. retryWhen条件重试

.retryWhen { cause, attempt -> attempt < 3 && cause is IOException }

7.2. cancellable响应协程取消

flow { ... }.cancellable()

8. Android扩展

8.1. flowWithLifecycle绑定生命周期的流

// implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.0")flow.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
    .collect { ... }

8.2. repeatOnLifecycle根据生命周期自动取消或重启协程

lifecycleScope.launch {    repeatOnLifecycle(Lifecycle.State.STARTED) {        viewModel.uiState.collect { ... }    }}
http://www.dtcms.com/a/268870.html

相关文章:

  • uniapp三步完成生成一维码图片
  • 在linux 上使用tcpdump监听http 端口的报文并分析
  • 部署NextCloud AIO + Frp + nginx-proxy-manager内网穿透私有云服务
  • [免费]基于Python豆瓣电影数据分析及可视化系统(Flask+echarts+pandas)【论文+源码+SQL脚本】
  • WebView安全实现(一)
  • 「Windows/Mac OS」AIGC图片生成视频 ,webui + stable-diffusion环境部署教程
  • Linux系统从入门到精通!第四天(shell编程和Docker)
  • 雪豹速清:智能清理,释放手机空间
  • 操作系统级TCP性能优化:高并发场景下的内核参数调优实践
  • 【机器学习笔记 Ⅲ】4 特征选择
  • WebDAV与内网穿透的协同创新:Joplin私有云同步架构深度解析
  • 【Linux系统】Linux权限 | Shell命令以及运行原理
  • 【Java安全】反射基础
  • (倍增)洛谷 P1613 跑路/P4155 国旗计划
  • VBA之Word应用第三章第十一节:Document对象的事件
  • 图像采集卡选型详细指南
  • SAP HANA内存数据库解析:特性、优势与应用场景 | 技术指南
  • OceanBase在.NET开发操作指南
  • 5、Receiving Messages:Message Listener Containers
  • 【Note】《Kafka: The Definitive Guide》第7章 Building Data Pipelines
  • 【牛客刷题】实现返回最大的不大于n的完美数的函数
  • [NOIP][C++]洛谷P1035 [NOIP 2002 普及组] 级数求和
  • 牛客周赛 Round 99 EF
  • 【PTA数据结构 | C语言版】求两个正整数的最大公约数
  • Camera相机人脸识别系列专题分析之十六:人脸特征检测FFD算法之libcvface_api.so数据结构详细注释解析
  • 芯谷科技--高性能双通道音频功率放大器D7050
  • LabVIEW与FPGA超声探伤
  • 单细胞数据格式转换:rds 与 h5ad互转
  • 倒排索引(Inverted Index)深度解析
  • uniapp跳转页面时如何带对象参数