Kotlin条件判断

xzbxzb 安卓 2025-11-20 110 0
Kotlin 中的条件判断主要包含 if-else(基础条件)和 when(替代 Java 的 switch,更灵活)两大核心,且 Kotlin 支持表达式式条件判断(条件块可返回值),相比 Java 更简洁高效。以下是详细用法和示例:

一、if-else 条件判断

if-else 是最基础的条件判断,Kotlin 中它既可以作为语句(无返回值),也可以作为表达式(有返回值,替代 Java 三元运算符)。

1. 基础用法(语句形式)

和 Java 类似,满足条件执行对应代码块:
val score = 85

// 单分支
if (score >= 60) {
    println("及格")
}

// 双分支
if (score >= 90) {
    println("优秀")
} else {
    println("非优秀")
}

// 多分支
if (score >= 90) {
    println("优秀")
} else if (score >= 80) {
    println("良好")
} else if (score >= 60) {
    println("及格")
} else {
    println("不及格")
}

2. 表达式形式(返回值)

Kotlin 没有 Java 的三元运算符 a ? b : c,而是直接用 if-else 表达式替代(条件块最后一行的值为返回值):
val score = 85
// 简单表达式:返回值赋值给变量
val level = if (score >= 90) {
    "优秀" // 分支最后一行是返回值
} else if (score >= 80) {
    "良好"
} else if (score >= 60) {
    "及格"
} else {
    "不及格"
}
println(level) // 输出:良好

// 极简写法(单行)
val isPass = if (score >= 60) true else false

3. 嵌套 if-else

适用于复杂条件场景:
val num = -5
if (num != 0) {
    if (num > 0) {
        println("正数")
    } else {
        println("负数")
    }
} else {
    println("零")
}

二、when 条件判断(核心)

when 是 Kotlin 对 Java switch 的增强,支持多值匹配、范围匹配、类型匹配、无参数匹配等,比 if-else if 更简洁,同样支持语句 / 表达式两种形式。

1. 基础用法(替代 switch)

匹配单个值,分支用 -> 分隔,else 对应 switch 的 default
val day = 3
// 语句形式
when (day) {
    1 -> println("周一")
    2 -> println("周二")
    3 -> println("周三")
    4, 5 -> println("周四/周五") // 多值合并(用逗号)
    6, 7 -> println("周六/周日")
    else -> println("无效日期") // 兜底分支(非必须,但若未覆盖所有情况则必须)
}

2. when 作为表达式(返回值)

和 if 一样,when 作为表达式时,分支最后一行是返回值,且必须覆盖所有情况(要么加 else,要么匹配所有可能值,比如枚举):
val day = 3
val dayName = when (day) {
    1 -> "周一"
    2 -> "周二"
    3 -> "周三"
    4, 5 -> "周四/周五"
    6, 7 -> "周六/周日"
    else -> "无效日期" // 表达式形式必须有 else(除非匹配所有可能)
}
println(dayName) // 输出:周三

// 枚举匹配(无需 else,因为覆盖所有枚举值)
enum class Season { SPRING, SUMMER, AUTUMN, WINTER }
val season = Season.SUMMER
val seasonDesc = when (season) {
    Season.SPRING -> "春暖花开"
    Season.SUMMER -> "夏日炎炎"
    Season.AUTUMN -> "秋高气爽"
    Season.WINTER -> "寒冬腊月"
}
println(seasonDesc) // 输出:夏日炎炎

3. 范围 / 集合匹配(in/!in)

when 支持用 in 判断值是否在范围、数组、集合中:
val score = 85
// 范围匹配(闭区间 1..100)
val grade = when (score) {
    in 90..100 -> "A"
    in 80 until 90 -> "B" // until 是左闭右开(80<=score<90)
    in 60 until 80 -> "C"
    in 0 until 60 -> "D"
    !in 0..100 -> "无效分数" // !in 表示不在范围内
    else -> "未知"
}
println(grade) // 输出:B

// 集合匹配
val fruits = listOf("苹果", "香蕉", "橙子")
val fruit = "香蕉"
when (fruit) {
    in fruits -> println("是常见水果")
    else -> println("小众水果")
}

4. 类型匹配(is/!is)

when 支持用 is 判断类型,且会自动智能类型转换(无需手动强转):
val obj: Any = "Kotlin"
when (obj) {
    is String -> println("字符串,长度:${obj.length}") // 自动转 String 类型
    is Int -> println("整数,值:${obj + 10}") // 自动转 Int 类型
    is Boolean -> println("布尔值:$obj")
    else -> println("未知类型")
}

5. 无参数 when(灵活条件)

省略 when 后的括号,分支直接写条件表达式,等价于 if-else if,但更易读:
val age = 25
when {
    age < 18 -> println("未成年人")
    age in 18..30 -> println("青年")
    age in 31..59 -> println("中年")
    age >= 60 -> println("老年")
    else -> println("无效年龄")
}

三、特殊场景:空安全条件判断

Kotlin 强调空安全,条件判断常结合 ?.(安全调用)、?:(Elvis 运算符)、!!(非空断言):
val str: String? = "Kotlin" // 可空字符串

// 1. 判空后执行
if (str != null && str.isNotEmpty()) { // 短路逻辑:str 不为空才执行后面
    println("字符串长度:${str.length}")
}

// 2. Elvis 运算符(str 不为空则取 str.length,否则取 0)
val length = str?.length ?: 0
println(length) // 输出:6

// 3. 结合 when 判空
when {
    str.isNullOrEmpty() -> println("字符串为空或空串")
    str.length > 5 -> println("字符串长度大于5")
    else -> println("字符串长度≤5")
}

四、总结

特性
if-else
when
适用场景
简单条件 / 嵌套条件
多值匹配、范围 / 类型匹配
表达式支持
支持(返回值)
支持(返回值)
简洁性
适合少量分支
适合多分支、复杂匹配
空安全结合
需手动判空
可结合is null判空
实际开发中:
  • 简单二选一 → 用 if-else 表达式;

  • 多值匹配 / 范围 / 类型判断 → 优先用 when

  • 复杂条件(无固定匹配值)→ 用无参数 when 替代 if-else if


 您阅读本篇文章共花了: 

版权声明

本文章如果涉及侵权,请联系我。
部分文章系本人原创未经许可,不得转载。

喜欢4发布评论

评论列表

发表评论

  • 昵称(必填)
  • 邮箱
  • 网址