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

Kotlin 高级语法复习:sealed class、Flow、inline、crossinline等分析,使用实例

🧱 一、Sealed Class(密封类)

✅ 概念

sealed class 是一种 受限制的类继承结构,用于表示一组固定类型的分支。
常见于 状态机(State)、结果类型(Result)、UI 状态管理中。

🧩 特点

  • 只能在同一个文件中被继承。

  • 常与 when 一起使用,可确保分支穷尽性检查(不需要 else)。

  • 类似 enum,但可携带不同数据类型。

🔧 示例

sealed class UiState {object Loading : UiState()data class Success(val data: String) : UiState()data class Error(val message: String) : UiState()
}

使用:

fun render(state: UiState) {when (state) {UiState.Loading -> println("加载中...")is UiState.Success -> println("加载成功: ${state.data}")is UiState.Error -> println("出错了: ${state.message}")}
}

🚀 场景

  • ViewModel 状态分发

  • 网络请求结果表示(Success / Error / Loading)

  • 事件流控制(Navigation、Dialog 状态)


🌊 二、Flow(异步数据流)

✅ 概念

Flow冷流(cold stream),用于异步、响应式的数据流处理。
类似 RxJava 的 Observable,但轻量且基于 Kotlin 协程。

🧩 核心要点

  • 冷流(Cold):只有在 collect() 时才开始执行。

  • 挂起(Suspend):可在协程中安全执行。

  • 背压(Backpressure):自动处理。

  • Flow → StateFlow / SharedFlow:分别用于状态持有、事件广播。

🔧 示例

fun fetchData(): Flow<Int> = flow {for (i in 1..3) {delay(1000)emit(i)}
}fun main() = runBlocking {fetchData().collect { value ->println("收到: $value")}
}

⚙️ 常见操作符

操作符说明示例
map映射flow.map { it * 2 }
filter过滤flow.filter { it > 1 }
onEach每次发射执行操作onEach { println(it) }
catch异常处理catch { e -> println(e) }
flowOn切换线程flowOn(Dispatchers.IO)

🚀 场景

  • UI 层监听数据变化

  • 轮询、分页加载

  • 替代 LiveData / RxJava


⚡ 三、inline(内联函数)

✅ 概念

inline 表示在编译时将函数体直接插入调用处,减少函数调用开销。
常用于 高阶函数(函数作为参数) 的性能优化。

🧩 示例

inline fun measure(block: () -> Unit) {val start = System.currentTimeMillis()block()println("耗时: ${System.currentTimeMillis() - start} ms")
}fun main() {measure {Thread.sleep(200)}
}

🔍 原理

  • 减少函数对象创建与调用栈。

  • 但会增加字节码体积(代码膨胀)。

🚀 场景

  • 性能关键的工具函数(如日志、统计)

  • DSL 构建器(如 applyrunuse

  • 避免 Lambda 捕获额外对象分配


🧩 四、crossinline(防止非局部返回)

✅ 问题背景

Kotlin 中 Lambda 默认支持「非局部返回」,即可以从外层函数返回。

inline fun test(block: () -> Unit) {block()println("函数结束")
}fun main() {test {println("执行中")return // ⛔ 从 main 返回(非局部返回)}
}

✅ 解决方式:crossinline

使用 crossinline 禁止 lambda 中使用 return 非局部返回。

inline fun safeRun(crossinline block: () -> Unit) {Thread {block() // 不允许非局部 return}.start()
}

这样可以安全地在异步或回调中调用。

🚀 场景

  • 在协程或异步任务中调用 lambda

  • 避免非局部 return 导致逻辑混乱


💡 组合实战示例:Flow + sealed class + inline + crossinline

sealed class Result<out T> {data class Success<T>(val data: T) : Result<T>()data class Error(val msg: String) : Result<Nothing>()object Loading : Result<Nothing>()
}inline fun <T> apiCall(crossinline block: suspend () -> T): Flow<Result<T>> = flow {emit(Result.Loading)try {val data = block()emit(Result.Success(data))} catch (e: Exception) {emit(Result.Error(e.message ?: "未知错误"))}
}.flowOn(Dispatchers.IO)// 使用
fun getUserFlow() = apiCall {delay(1000)"用户数据"
}fun main() = runBlocking {getUserFlow().collect {when (it) {is Result.Loading -> println("加载中...")is Result.Success -> println("成功: ${it.data}")is Result.Error -> println("失败: ${it.msg}")}}
}

🧠 解析:

  • sealed class 管理状态。

  • inline + crossinline 优化 lambda 调用,防止非局部 return。

  • Flow 构建响应式请求流。

  • flowOn(IO) 切换线程,安全执行网络任务。


✅ 总结对比表

关键字功能特点常用场景
sealed class受限继承结构强类型状态控制状态管理、Result 封装
Flow异步流处理冷流、挂起、安全数据流、网络加载、事件流
inline内联优化减少函数对象、提升性能高阶函数、DSL、工具函数
crossinline禁止非局部返回保证 lambda 安全异步回调、线程任务
http://www.dtcms.com/a/537891.html

相关文章:

  • 怎么做wood网站教程长沙企业网站
  • 顺德网站制作案例机构天津seo优化公司哪家好
  • 力扣-移动零
  • 如何通过7种简单方法将小米手机数据传输到电脑
  • wap网站编辑器英文版网站建站要求
  • 网站设计和策划的步骤是什么东莞公司网站建设教程
  • 数学分析简明教程课后习题详解——1.1
  • Linux下编译lib-artnet-4-cpp
  • 哪些网站适合做外贸网站推广apm安装wordpress网页无法访问
  • 网站建设所有软件清单苏州制作手机网站
  • 免费的舆情网站不需下载有没有免费的网站推销产品
  • 搭建网站商城去哪个网站可以做写手
  • 【Python刷力扣hot100】42. Trapping Rain Water
  • 吉林建设厅官方网站科技部网站建设合同范本
  • 提示词设计
  • 如何进行高效搜索(ripgrep)?
  • 项目网络网站优化协议
  • 长沙需要做网站的企业浙江省建设信息港网
  • 2025残保金申报进入最后“窗口期”!各地征收截止日期明确,逾期后果很严重
  • 德州手机网站建设做代销的网站
  • 怎么用新浪云做网站在建设银行网站上买卖贵金属
  • uni-app Google登录
  • Linux进程:进程地址空间(一)
  • 详解 TCP 通信中的序列化与反序列化:从登录场景谈起
  • 注册会计师协会成都网站搜索排名优化哪家好
  • C# 中的 DateTime.Now.ToString() 方法支持多种预定义的格式字符
  • Three.js 实现 3d 面积图
  • QtQuick3D入门(4):天空盒
  • 自己做网站要不要租服务器做的比较好的p2p网站
  • 动态规划算法