1. Java 的 switch 语句
Java 的 switch 语句虽然历史悠久,但在表达能力和灵活性上相比 Kotlin 的 when 有一定差距。在 Java 7 之前,switch 只支持基本数据类型(如 int
、char
)和枚举类型;从 Java 7 开始,才支持使用 String
类型。
下面是一个典型的使用 switch
的例子:
int number = 3;
String description;
switch (number) {
case 0:
description = "Zero";
break;
case 1:
case 2:
description = "One or Two";
break;
case 3:
case 4:
case 5:
description = "Between Three and Five";
break;
default:
description = "Other";
}
System.out.println(description);
✅ 说明:
case
后面接的是具体的匹配值- 多个值共享一个逻辑时,需要多个
case
并列 - 每个
case
分支执行完后要加break
,否则会继续向下执行(fall-through) default
是可选的,用于兜底
⚠️ 踩坑提醒:忘记写 break
会导致逻辑错误,这是 Java switch
常见的“坑”。
2. Kotlin 的 when 表达式
Kotlin 的 when 是一种更现代、更灵活的条件判断表达式,可以看作是 Java switch
的增强版。它不仅语法更简洁,而且功能更强大。
来看一个等价的 Kotlin 实现:
fun describeNumber(number: Int): String {
return when (number) {
0 -> "Zero"
1, 2 -> "One or Two"
in 3..5 -> "Between Three and Five"
else -> "Other"
}
}
✅ 特点总结:
- 支持多个值用逗号分隔(如
1, 2
) - 可以使用
in
关键字判断是否在某个区间(如in 3..5
) - 不需要
break
,不会有 fall-through 的问题 else
是必须的,用于兜底,避免遗漏逻辑分支
💡 小技巧:when
还可以不带参数使用,此时每个分支是一个布尔表达式:
when {
number == 0 -> "Zero"
number in 1..2 -> "One or Two"
number in 3..5 -> "Between Three and Five"
else -> "Other"
}
这种写法在判断逻辑较复杂时非常实用。
3. Java switch 与 Kotlin when 的对比
✅ 相似之处
对比点 | 说明 |
---|---|
功能定位 | 都是用于多条件分支判断 |
多分支支持 | 都支持多个 case 分支 |
可读性 | 相比多个 if-else 更清晰 |
❌ 不同之处
对比点 | Java switch | Kotlin when |
---|---|---|
支持类型 | 基本类型、枚举、String(Java 7+) | 任意类型 |
区间判断 | 不支持,需多个 case 或 if-else | 支持 in 判断范围 |
多值匹配 | 需要多个 case 共享一个逻辑 | 用逗号分隔多个值 |
Fall-through | 默认会继续执行下一个 case | 不会自动 fall-through |
表达式 vs 语句 | 语句(无返回值) | 表达式(可返回值) |
是否需要 default | 不强制 | 强制需要 else 分支 |
4. 总结
Kotlin 的 when 相比 Java 的 switch 更加灵活、安全和表达力更强:
- ✅ 支持任意类型、区间判断、布尔表达式
- ✅ 无 fall-through 问题,不需要写
break
- ✅ 支持返回值,可以作为表达式使用
- ❌ Java 的
switch
在表达复杂逻辑时略显笨拙,容易出错
如果你正在使用 Kotlin,建议优先使用 when
来替代传统的多条件判断逻辑。不仅代码更简洁,也更易于维护和扩展。
如需查看完整示例代码,欢迎访问 GitHub:Kotlin when vs Java switch 示例代码