ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 返回和跳转 [TOC] Kotlin 有三种结构化跳转表达式: * return:默认从最直接包围它的函数或者[匿名函数](http://www.kotlincn.net/docs/reference/lambdas.html#匿名函数)返回。 * break:终止最直接包围它的循环。 * continue:继续下一次最直接包围它的循环 所有这些表达式都可以用作更大表达式的一部分: ``` val s = person.name ?: return ``` ### Break 与 Continue break 和 continue 都是用来控制循环结构的,主要是用来停止循环(中断跳转)。 #### **1.break** 我们在写代码的时候,经常会遇到在某种条件出现的时候,就直接提前终止循环。而不是等到循环条件为 false 时才终止。这个时候,我们就可以使用 break 结束循环。 break 用于完全结束一个循环,直接跳出循环体,然后执行循环后面的语句。 #### **2.continue** continue 是只终止本轮循环,但是还会继续下一轮循环。可以简单理解为,直接在当前语句处中断,跳转到循环入口,执行下一轮循环。而 break 则是完全终止循环,跳转到循环出口。 示例:打印数字1~10,只要遇到偶数,就结束打印。 ~~~ fun main(args: Array<String>) { println("............break的结果...........") breakTest() println("............continue的结果...........") continueTest() } fun breakTest(){ for (i in 1..10){ println(i) if ( i %2 == 0){ break } }// break to here } fun continueTest(){ for ( i in 1..10){ if ( i %2 ==0){ continue } println(i) } } ~~~ 运行结果 ``` ............break的结果........... 1 2 ............continue的结果........... 1 3 5 7 9 Process finished with exit code 0 ``` ### Break 与 Continue 标签 和Java不同的是,在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟`@`符号,例如:`abc@`、`fooBar@`都是有效的标签(参见[语法](http://www.kotlincn.net/docs/reference/grammar.html#label))。 **要为一个表达式加标签,我们只要在其前加标签即可**。 ``` loop@ for (i in 1..100) { // …… } ``` 现在,我们可以用标签限制break或者continue: ``` loop@ for (i in 1..100) { for (j in 1..100) { if (……) break@loop } } ``` 标签限制的 break 跳转到刚好位于该标签指定的循环后面的执行点。continue继续标签指定的循环的下一次迭代。 ~~~ loop@ for (i in 1..100) { for (j in 1..100) { if (……) break@loop // 终止loop标记的循环 if (……) continue@loop // 跳出loop标记的循环,继续下一次loop标记的循环 } } ~~~ #### **示例代码** ~~~ fun main(args: Array<String>) { //通常当我们在循环体中使用break,是跳出最近外层的循环 println(".......无标签,直接跳出最近外层的循环........") for (i in 1..5) { for (j in 1..10) { if (j % 2 == 0) { break } println("i = $i, j = $j") } } //当我们想直接跳转到外层for循环,这个时候我们就可以使用标签了 //定义标签,直接跳转到外层for循环 println(".......直接跳转到外层for循环........") outer@ for (i in 1..5) { for (j in 1..10) { if (j % 2 == 0) { //break到指定标签 break@outer } println("i = $i, j = $j") } } //为了代码可读性,我们可以用标签来显式地指出循环体的跳转地址 //定义标签,指明内层循环的跳转地址 println(".......显示地,直接跳转到内层for循环........") for (i in 1..5) { iner@for (j in 1..10) { if (j % 2 == 0) { //break到指定标签 break@iner } println("i = $i, j = $j") } } } ~~~ 运行结果 ``` .......无标签,直接跳出最近外层的循环........ i = 1, j = 1 i = 2, j = 1 i = 3, j = 1 i = 4, j = 1 i = 5, j = 1 .......直接跳转到外层for循环........ i = 1, j = 1 .......显示地,直接跳转到内层for循环........ i = 1, j = 1 i = 2, j = 1 i = 3, j = 1 i = 4, j = 1 i = 5, j = 1 Process finished with exit code 0 ```