课程表

Kotlin课程

工具箱
速查手册

Kotlin 循环控制

当前位置:免费教程 » 移动开发 » Kotlin

For 循环

for 循环可以对任何提供迭代器(iterator)的对象进行遍历,语法如下:

  1. for (item in collection) print(item)

循环体可以是一个代码块:

  1. for (item: Int in ints) {
  2. // ……
  3. }

如上所述,for 可以循环遍历任何提供了迭代器的对象。

如果你想要通过索引遍历一个数组或者一个 list,你可以这么做:

  1. for (i in array.indices) {
  2. print(array[i])
  3. }

注意这种"在区间上遍历"会编译成优化的实现而不会创建额外对象。

或者你可以用库函数 withIndex:

  1. for ((index, value) in array.withIndex()) {
  2. println("the element at $index is $value")
  3. }

实例

对集合进行迭代:

  1. fun main(args: Array<String>) {
  2. val items = listOf("apple", "banana", "kiwi")
  3. for (item in items) {
  4. println(item)
  5. }
  6.  
  7. for (index in items.indices) {
  8. println("item at $index is ${items[index]}")
  9. }
  10. }

尝试一下

输出结果:

  1. apple
  2. banana
  3. kiwi
  4. item at 0 is apple
  5. item at 1 is banana
  6. item at 2 is kiwi

while 与 do...while 循环

while是最基本的循环,它的结构为:

  1.  
  2. <pre>
  3. while( 布尔表达式 ) {
  4. //循环内容
  5. }

do…while 循环 对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。

do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。

  1. do {
  2. //代码语句
  3. }while(布尔表达式);
  4.  
do { //代码语句 }while(布尔表达式);

实例

  1. fun main(args: Array<String>) {
  2. println("----while 使用-----")
  3. var x = 5
  4. while (x > 0) {
  5. println( x--)
  6. }
  7. println("----do...while 使用-----")
  8. var y = 5
  9. do {
  10. println(y--)
  11. } while(y>0)
  12. }

尝试一下

输出结果:

  1. ----while 使用-----
  2. 5
  3. 4
  4. 3
  5. 2
  6. 1
  7. ----do...while 使用-----
  8. 5
  9. 4
  10. 3
  11. 2
  12. 1

返回和跳转

Kotlin 有三种结构化跳转表达式:

  • return。默认从最直接包围它的函数或者匿名函数返回。
  • break。终止最直接包围它的循环。
  • continue。继续下一次最直接包围它的循环。

在循环中 Kotlin 支持传统的 break 和 continue 操作符。

  1. fun main(args: Array<String>) {
  2. for (i in 1..10) {
  3. if (i==3) continue // i 为 3 时跳过当前循环,继续下一次循环
  4. println(i)
  5. if (i>5) break // i 为 6 时 跳出循环
  6. }
  7. }

尝试一下

输出结果:

  1. 1
  2. 2
  3. 4
  4. 5
  5. 6

Break 和 Continue 标签

在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、fooBar@都是有效的标签。 要为一个表达式加标签,我们只要在其前加标签即可。

  1. loop@ for (i in 1..100) {
  2. // ……
  3. }

现在,我们可以用标签限制 break 或者continue:

  1. loop@ for (i in 1..100) {
  2. for (j in 1..100) {
  3. if (……) break@loop
  4. }
  5. }

标签限制的 break 跳转到刚好位于该标签指定的循环后面的执行点。 continue 继续标签指定的循环的下一次迭代。

标签处返回

Kotlin 有函数字面量、局部函数和对象表达式。因此 Kotlin 的函数可以被嵌套。 标签限制的 return 允许我们从外层函数返回。 最重要的一个用途就是从 lambda 表达式中返回。回想一下我们这么写的时候:

  1. fun foo() {
  2. ints.forEach {
  3. if (it == 0) return
  4. print(it)
  5. }
  6. }

这个 return 表达式从最直接包围它的函数即 foo 中返回。 (注意,这种非局部的返回只支持传给内联函数的 lambda 表达式。) 如果我们需要从 lambda 表达式中返回,我们必须给它加标签并用以限制 return。

  1. fun foo() {
  2. ints.forEach lit@ {
  3. if (it == 0) return@lit
  4. print(it)
  5. }
  6. }

现在,它只会从 lambda 表达式中返回。通常情况下使用隐式标签更方便。 该标签与接受该 lambda 的函数同名。

  1. fun foo() {
  2. ints.forEach {
  3. if (it == 0) return@forEach
  4. print(it)
  5. }
  6. }

或者,我们用一个匿名函数替代 lambda 表达式。 匿名函数内部的 return 语句将从该匿名函数自身返回

  1. fun foo() {
  2. ints.forEach(fun(value: Int) {
  3. if (value == 0) return
  4. print(value)
  5. })
  6. }

当要返一个回值的时候,解析器优先选用标签限制的 return,即

  1. return@a 1

意为"从标签 @a 返回 1",而不是"返回一个标签标注的表达式 (@a 1)"。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号