🧱 一、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 安全异步回调、线程任务
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐