条件和循环
If 表达式
在 Kotlin 中, if
是一个表达式:它返回一个值。 因此,Kotlin 没有三目运算符 (condition ? then : else
),因为普通的 if
在这个角色中已经表现得很好了。
if
表达式的分支可以是代码块。在这种情况下,代码块的最后一个表达式是该块的值:
如果你将 if
用作表达式,例如用于 返回它的值 或 赋值给变量, else
分支是必需的。
when
表达式和语句
when
是一个条件表达式,根据多个可能的值或条件执行代码。 它类似于 Java、C 及类似语言中的 switch
语句。例如:
when
会按顺序将其参数与所有分支进行匹配,直到某个分支的条件达到满足。
您可以以几种不同的方式使用 when
。首先,您可以将 when
作为 表达式 或 语句 使用。
作为表达式, when
返回一个值,以供稍后在代码中使用。作为语句, when
完成一个动作,但不返回任何进一步有用的内容:
表达式 | 语句 |
---|---|
// 返回一个字符串并将其赋值给 text 变量
val text = when (x) {
1 -> "x == 1"
2 -> "x == 2"
else -> "x is neither 1 nor 2"
}
|
// 不返回任何内容,但会触发
// 打印语句
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> print("x is neither 1 nor 2")
}
|
其次,您可以选择带有或不带有主体的 when
。无论您是否使用主体,您的表达式或语句的行为都是相同的。 我们建议在可能的情况下使用带有主体的 when
,因为它能使您的代码更易于阅读和维护,并清楚地显示您正在检查的内容。
带主体 | 不带主体 |
---|---|
when(x) { ... }
|
when { ... }
|
根据您使用 when
的方式,是否需要覆盖所有可能的情况在不同情况下有不同的要求。
如果您将 when
用作语句,则不必覆盖所有可能的情况。 在此示例中,某些情况没有覆盖,因此不会发生任何事情。但不会出现错误:
在 when
语句中,单个分支的值会被忽略。 就像使用 if
一样,每个分支可以是一个代码块,它的值是该块中最后一个表达式的值。
如果您将 when
用作表达式,则必须覆盖所有可能的情况。 换句话说,它必须是 完全穷尽的。 第一个匹配分支的值将成为整个表达式的值。如果没有覆盖所有情况,编译器会抛出错误。
如果您的 when
表达式有主体,您可以使用 else
分支来确保覆盖所有可能的情况,但这并不是强制性的。 例如,如果您的主体是 Boolean
、 enum
类、 sealed
类 或它们的可空类型,您可以在不使用 else
分支的情况下覆盖所有情况:
如果您的 when
表达式 没有 主体,则 必须 有一个 else
分支,否则编译器会抛出错误。 当没有其他分支条件满足时, else
分支将被执行:
when
表达式和语句提供了不同的方式来简化代码、处理多个条件并执行类型检查。
您可以通过在一行中使用逗号组合多个条件,定义多个情况的共同行为:
您可以使用任意表达式(不仅限于常量)作为分支条件:
您还可以通过 in
或 !in
关键字检查一个值是否包含在某个 区间 或集合中:
此外,您可以通过 is
或 !is
关键字检查一个值是否是特定类型。 需要注意的是,由于 智能类型转换 ,您可以在不进行额外检查的情况下访问该类型的成员函数和属性。
您可以将 when
作为 if
-else
链的替代方案。 如果没有主体,分支条件就是布尔表达式。第一个条件为 true
的分支会执行:
您可以通过以下语法将主体捕获到一个变量中:
作为主体引入的变量的作用域仅限于 when
表达式或语句的主体部分。
For 循环
for
循环用于迭代任何提供迭代器的对象。在类似 C# 的语言中,这类似于 foreach
循环。 for
的语法如下:
for
的主体可以是一个代码块。
如上所述, for
循环迭代任何提供迭代器的对象。这意味着:
具有一个成员或扩展函数
iterator()
,它返回一个Iterator<>
,该迭代器:有一个成员或扩展函数
next()
有一个成员或扩展函数
hasNext()
返回Boolean
。
这三个函数都需要标记为 operator
。
要迭代一系列数字,使用 区间表达式:
for
循环遍历区间或数组会被编译为基于索引的循环,而不会创建迭代器对象。
如果你想通过索引遍历数组或列表,可以这样做:
或者,你可以使用 withIndex
库函数:
While 循环
while
和 do-while
循环会在条件满足时不断地处理它们的主体。它们之间的区别在于条件检查的时间:
while
在每次处理主体之前先检查条件,如果条件满足,则处理主体,然后返回进行条件检查。do-while
先处理主体,再检查条件。如果条件满足,循环会重复。因此,do-while
的主体至少会执行一次,无论条件是否满足。
循环中的 Break 和 Continue
Kotlin 支持在循环中使用传统的 break
和 continue
操作符。详见返回和跳转。