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

Kotlin协程 -> Flow和FlowCollector接口声明的意义

源码

// ✅ 精准总结
public interface Flow<out T> {           // out 声明在接口上public suspend fun collect(collector: FlowCollector<T>)  // 方法没有 out/in
}public fun interface FlowCollector<in T> {  // in 声明在接口上  public suspend fun emit(value: T)       // 方法没有 out/in
}

🔄 赋值兼容性的两个方向

1. Flow 的向上兼容(out)- 收集可以更抽象

// 🎯 Flow<out T> 让收集变得更抽象
val userFlow: Flow<User> = flowOf(User("Alice"))
val entityFlow: Flow<Entity> = userFlow      // ✅ 向上:具体 → 抽象
val anyFlow: Flow<Any> = userFlow           // ✅ 向上:具体 → 更抽象// 🚀 实际意义:可以用更抽象的类型来收集具体的数据流
suspend fun collectAbstractly() {val concreteFlow: Flow<String> = flowOf("Hello")val abstractFlow: Flow<Any> = concreteFlow  // 收集变得更抽象abstractFlow.collect { value ->// value 编译时是 Any,运行时是 Stringprintln("收集到: $value")}
}

2. FlowCollector 的向下兼容(in)- 处理可以更具体

// 🎯 FlowCollector<in T> 让处理变得更具体
val anyCollector: FlowCollector<Any> = FlowCollector { println("处理: $it") }
val entityCollector: FlowCollector<Entity> = anyCollector  // ✅ 向下:抽象 → 具体
val userCollector: FlowCollector<User> = anyCollector      // ✅ 向下:抽象 → 更具体// 🚀 实际意义:可以用抽象的处理器来处理具体的数据类型
suspend fun processSpecifically() {val abstractProcessor: FlowCollector<Any> = FlowCollector { data ->println("通用处理: $data")}val concreteProcessor: FlowCollector<String> = abstractProcessor  // 处理变得更具体flowOf("Hello").collect(concreteProcessor)  // 用抽象处理器处理具体数据
}

🎯 完美的配合关系

// 🔄 两个方向的兼容性完美配合
suspend fun perfectMatch() {// 1️⃣ 创建具体的数据流val stringFlow: Flow<String> = flowOf("Hello", "World")// 2️⃣ 创建抽象的处理器val anyProcessor: FlowCollector<Any> = FlowCollector { value ->println("处理任何类型: $value")}// 3️⃣ 协变:Flow 向上兼容(具体 → 抽象)val anyFlow: Flow<Any> = stringFlow// 4️⃣ 逆变:FlowCollector 向下兼容(抽象 → 具体)val stringProcessor: FlowCollector<String> = anyProcessor// 5️⃣ 完美匹配:具体的数据流 + 具体的处理器stringFlow.collect(stringProcessor)// 🎯 或者:抽象的数据流 + 抽象的处理器anyFlow.collect(anyProcessor)
}
http://www.dtcms.com/a/553622.html

相关文章:

  • Postman接口测试: Postman环境变量全局变量设置,多接口顺序执行详解
  • 达梦数据库到Greenplum:用ETL工具实现数据仓库迁移
  • 建设网站需要注意什么问题中国铁建最新消息
  • 【Windows】Anaconda3-2025-x86_64的安装教程,使用【notebook】和【PyCharm】测试环境
  • Rust开发之使用match和if let处理Result错误
  • 九九重阳敬桑榆 众趣科技VR漫游让养老选择更安心
  • 什么是索引?索引对查询性能的影响?
  • 【ESP32 IDF】巴发云实现HTTP OTA功能
  • 会议室玻璃门秒装智能锁,还能对接多种会议预约APP
  • ​QT备份项目,如何避免无法运行
  • 设计师一般用什么网站诊所网站建设
  • FAST开发方法在在线运动器材销售系统分析中的应用详解
  • 佛山市官网网站建设多少钱房屋设计软件app自己设计画图
  • 21.5 三大云平台容器化部署终极对决:AWS ECS vs Azure ACI vs GCP Cloud Run实战指南
  • 论文学习_Unleashing the power of pseudo-code for binary code similarity analysis
  • 网站哪个公司做的好可以做围棋习题的网站
  • 分散加载文件(sct)的属性关键字列表
  • 【音频】linux音频混合服务器 PulseAudio 和 JACK
  • ACC清分系统金仓数据库迁移实战:无损迁移与性能调优全解析
  • wap网站开发和自适应服务器的作用和用途
  • 做网站需要懂什么做众筹网站怎么赚钱吗
  • 【FPGA】时序逻辑计数器——板级验证
  • 创实信息正式成为极狐GitLab中国授权代理
  • 智慧水厂智慧水务平台建设方案
  • N8N系列:新手课程,本地 N8N 不安全?Windows 下 HTTPS 配置指南,新手也能看懂
  • 商业网站建设定位网站空间太小
  • 【计算机基础】之CPU制造
  • 310.力扣LeetCode_ 最小高度树_直径法_DFS
  • 建设电影网站选服务器怎么选贵州安顺做公司网站
  • 小城镇建设的网站中的主要观点个人域名备案查询