Kotlin when 用法完整分享

背景

when 是 Kotlin 中功能非常强大的条件表达式,可以看作是 switch 的升级版。它有两种主要用法:带参数不带参数。理解这两种用法及其适用场景,有助于写出更简洁、更易读的代码。


一、带参数的 when

基本语法

Kotlin 复制代码
when (variable) {
    value1 -> action1()
    value2 -> action2()
    else -> defaultAction()
}

示例

Kotlin 复制代码
// 判断具体值
when (status) {
    "success" -> println("成功")
    "error" -> println("错误")
    "loading" -> println("加载中")
    else -> println("未知状态")
}

// 判断类型
when (response) {
    is Success -> handleSuccess(response)
    is Error -> handleError(response)
    is Loading -> showLoading()
}

// 多值匹配
when (code) {
    200, 201 -> println("请求成功")
    404 -> println("未找到")
    500 -> println("服务器错误")
    else -> println("其他状态码: $code")
}

特点

  • 适合对同一个变量进行多分支判断。

  • 支持类型判断与多值匹配。

  • 可读性好,类似 Java 的 switch,但更灵活。


二、不带参数的 when

基本语法

Kotlin 复制代码
when {
    condition1 -> action1()
    condition2 -> action2()
    else -> defaultAction()
}

示例

Kotlin 复制代码
// 判断不同条件
when {
    response == null -> handleNull()
    response.isSuccess() -> handleSuccess()
    else -> handleFailure()
}

// 复杂条件组合
fun shouldShowPromotion(user: User?): Boolean = when {
    user == null -> false
    user.isVip -> false
    user.signInDays > 7 -> true
    user.purchaseCount == 0 -> true
    else -> false
}

// UI 显示逻辑
fun getViewVisibility(): Int = when {
    isLoading -> View.GONE
    data.isNullOrEmpty() -> View.GONE
    hasError -> View.VISIBLE
    else -> View.VISIBLE
}

特点

  • 不依赖单一变量。

  • 更灵活,可以混合不同条件。

  • 常用于多条件判断和复杂逻辑表达。


三、对比总结

特性 带参数 when(x) 不带参数 when { }
适用场景 判断同一变量的不同值 判断多个独立条件
可读性 针对单一变量更清晰 更灵活,但条件过多易复杂化
常见用例 状态码、枚举、类型匹配 null 检查、UI 状态控制、业务逻辑

四、最佳实践

  • 单一变量多分支 :优先用带参数的 when(x),更简洁直观。

  • 多条件组合判断 :使用不带参数的 when {},避免嵌套 if-else

  • 覆盖所有情况 :尽量包含 else 分支,确保健壮性(除非编译器可确定已覆盖所有情况)。


总结

👉 when(x):用于同一个变量 的多种取值(如枚举、状态码)。

👉 when {}:用于多个条件的判断(如逻辑组合、状态切换)。

相关推荐
weixin_4407305012 分钟前
使用pytest中方法控制执行步骤(test_begin.py、test_end.py,@pytest.mark.run(order=1))
开发语言·python·pytest
AFinalStone13 分钟前
Android 7系统无障碍服务(五)AccessibilityNodeInfo 的构建与查询
android·无障碍服务
geovindu40 分钟前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
今天要早睡_1 小时前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
心易行者1 小时前
Python自动化测试7步落地法:用python在线运行省掉90%环境配置时间
java·开发语言·人工智能·python·log4j·ai编程
啦啦啦~~~2221 小时前
PC端+安卓端阅读器推荐!开源本地小说阅读器软件,
android·论文阅读·windows·开源软件·福昕阅读器
tedcloud1231 小时前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源
Tanjia_kiki2 小时前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
程序猿编码2 小时前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
我命由我123452 小时前
Android Jetpack Compose 开发问题:Unresolved reference ‘Icons‘.
android·java-ee·kotlin·android studio·android jetpack·android-studio·android runtime