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 构建器(如
apply、run、use)避免 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 安全 | 异步回调、线程任务 |
