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

为什么 CompletableDeferred 不适合数据流---》数据流的正确解决方案

1. 单次性限制

val deferred = CompletableDeferred<String>()// 只能完成一次
deferred.complete("第一个值")
deferred.complete("第二个值") // 这个会被忽略!val result = deferred.await() // 永远只能得到 "第一个值"

2. 无法处理多个值

// 错误用法:试图用多个 CompletableDeferred
val deferred1 = CompletableDeferred<String>()
val deferred2 = CompletableDeferred<String>()
val deferred3 = CompletableDeferred<String>()// 这会导致复杂的协调和资源管理问题

数据流的正确解决方案

对于数据流场景,Kotlin 提供了专门的解决方案:

1. Flow - 最推荐的方案

// 创建数据流
fun dataStream(): Flow<String> = flow {emit("数据1")delay(1000)emit("数据2") delay(1000)emit("数据3")
}// 收集数据流
fun main() = runBlocking {dataStream().collect { value ->println("收到: $value")}
}

2. Channel - 用于热数据流

fun main() = runBlocking {val channel = Channel<String>()// 生产者launch {channel.send("消息1")delay(1000)channel.send("消息2")delay(1000)channel.send("消息3")channel.close() // 结束流}// 消费者launch {for (msg in channel) {println("消费: $msg")}}
}

3. StateFlow - 状态管理

class DataManager {private val _state = MutableStateFlow("初始状态")val state: StateFlow<String> = _state.asStateFlow()fun updateData() {_state.value = "更新后的状态"}
}// 监听状态变化
fun main() = runBlocking {val manager = DataManager()launch {manager.state.collect { state ->println("状态变化: $state")}}delay(1000)manager.updateData()
}

4. SharedFlow - 事件总线模式

object EventBus {private val _events = MutableSharedFlow<String>()val events = _events.asSharedFlow()suspend fun emitEvent(event: String) {_events.emit(event)}
}// 多个订阅者
fun main() = runBlocking {// 订阅者1launch {EventBus.events.collect { event ->println("订阅者1收到: $event")}}// 订阅者2  launch {EventBus.events.collect { event ->println("订阅者2收到: $event")}}// 发布事件EventBus.emitEvent("事件1")delay(1000)EventBus.emitEvent("事件2")
}

场景对比表

场景适合的方案不适合的方案
单次异步结果CompletableDeferredasyncFlowChannel
持续数据流FlowChannelCompletableDeferred
状态管理StateFlowLiveDataCompletableDeferred
事件广播SharedFlowBroadcastChannelCompletableDeferred
请求-响应CompletableDeferredsuspend函数

Flow

实际例子对比

❌ 错误:用 CompletableDeferred 处理数据流

// 反模式!
class WrongStreamProcessor {private var currentDeferred: CompletableDeferred<String>? = nullfun processStream() {// 复杂的协调逻辑,容易出错// 需要管理多个 CompletableDeferred// 资源泄漏风险高}
}

✅ 正确:用 Flow 处理数据流

class StreamProcessor {fun dataStream(): Flow<String> = flow {var count = 0while (true) {emit("数据${count++}")delay(1000)}}suspend fun process() {dataStream().take(10) // 只取前10个.collect { data ->println("处理: $data")}}
}

总结

判断:

  • CompletableDeferred:适合单次的异步结果(如网络请求响应、用户确认)

  • Flow/Channel:适合持续的数据流(如实时数据更新、事件流、状态变化)

选择正确的工具很重要:

  • 需要一次性结果?用 CompletableDeferred

  • 需要持续的数据流?用 Flow 或 Channel

  • 需要状态管理?用 StateFlow

  • 需要事件广播?用 SharedFlow

这样可以避免很多不必要的复杂性和潜在的错误!

http://www.dtcms.com/a/454821.html

相关文章:

  • 大连模版网站网页紧急升级维护中升级
  • 向量表与重定位(Cortex‑M 系列)
  • 网站空间是不是服务器河南省建设厅举报网站
  • Linux中查询运行进程的命令
  • 四川建设厅网站施工员证查询建设学校网站多钱
  • 微信小程序连接OneNET需要生成token,简单快速的办法
  • 做网站还是自媒体更适合赚钱wordpress主题 游戏
  • Python3 tuple 函数
  • 网站建设公司江苏wordpress下载类主题
  • 作者新游戏1.2
  • 中国建设银行网站登陆免费个人网页模板
  • 网站建设怎么赚钱深圳市电商网站建设企业
  • 【Linux】线程概念与控制(1)
  • 网站做5年有多少流量网站关键词如何布局
  • H5网站开发工程师网站建设网站形象
  • 狮岭做包包的网站优秀网站推荐
  • Python chr() 函数
  • wordpress网站文章排版插件镇海建设银行网站
  • 用cms建网站ps网站首页设计图制作教程
  • wordpress 浮动播放器seo工作前景如何
  • wordpress做什么网站好网站推广策略有哪些
  • 昆山外贸公司网站建设流程国内做网站哪家公司好
  • 沧州各种网站wordpress首页循环
  • [Java]PTA:(选做) jmu-Java-03面向对象基础-clone方法、标识接口、深拷贝
  • 酒店网站建设考虑的因素wordpress手机版切换
  • Makefile快速入门1
  • 网站信息架构图怎么做阿里巴巴网站维护要怎么做
  • 企业网站网络营销婚礼婚庆网站建设需求分析
  • C4D组域及其他常见的8种域:深度解析与应用指南
  • 网站建设内容3000字网站制作群系统