1、支持集合直接作为循环体的条件:
// - - - - 支持集合遍历 - - - - var arr = Array(10, 20, 30) var arr2 = List(10, 20, 30) var arr3 = Set(10, 20, 30) for (i <- arr) println(i) for (i <- arr2) println(i) for (i <- arr3) println(i)
2、循环守卫,支持一些寻找特定条件的循环
// 相当于一个语法糖,缩写了很多东西,不满足IF条件的循环等同于执行了continue for (i <- 1 to 3 if i != 2) { println(i) } // 拓展出来就是 从1重复执行到3,当i不等于2时执行打印i for (i <- 1 to 3) { if (i != 2) { println(i) } }
3、对步长的设置
// - - - - 步长设置 - - - - for (i <- 1 to 100 by 2) { println(i) // 1 3 5 7 9 .... by设置步长 } for (i <- 1 to 100 by -2) { println(i) // 如果正向迭代,不可以这样设置负数的步长,迭代将不会跳出来,这样是一个死循环了 } for (i <- 100 to 1 by -4) { println(i) // 表示反向的循环 } for (i <- 1 to 10 reverse) { // 也可以使用reverse来表示逆向循环 println(i) } for (i <- 0.1 to 3.14 by 0.2) { // for也可以使用浮点数进行循环,但是会有精度问题,不建议使用 println(i) }
4、嵌套循环
// 嵌套循环 // Java语法 for (i <- 1 to 10) { for (j <- 1 to 5) { println(s"i = ${i}, j = ${j}") } } // Scala语法可缩写至 for(i <- 1 to 10; j <- 1 to 5) { println(s"i = ${i}, j = ${j}") } // 乘法表案例 for (row <- 1 to 9; column <- 1 to row) { print(s"${row} * ${column} = ${row * column}\t") if (row == column) println() }
5、引入变量
for { // 当需要写入多种条件时,可以使用这种展开的条件体 iterator <- 1 to 10 variable = iterator - 3 } { println(s"iterator = ${iterator}, variable = ${variable}") }
6、九层妖塔案例
// 方案1 for(level <- 1 to 9) { val symbol = 2 * level - 1 val blank = 9 - level println(" " * blank + "*" * symbol) } // 方案2 for { level <- 1 to 9 symbol = 2 * level - 1 blank = 9 - level } { println(" " * blank + "*" * symbol) } // 方案3 for { symbol <- 1 to 17 by 2 blank = (17 - symbol) / 2 } { println(" " * blank + "*" * symbol) }
7、循环的返回
// 循环返回 val result = for(iterator <- 1 to 10) {} // for循环的默认返回值为UNIT // yield 指定一个变量为循环装填的元素 val vector = for(iterator <- 1 to 10) yield iterator // for会返回一个Vector集合容器给vector变量 println(vector) // 打印输出 Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
8、While循环
do while 和 while 和 Java 一致,没有做语法处理,这里跳过省略了
9、循环退出
Scala语法这里不再支持Break和Continue,改用了一个Breakable控制结构体来实现
// Java语法 try { for (i <- 0 until 5) { if (i == 3) throw new RuntimeException println(i) } } catch { case exception: Exception => println(exception) // 打印报错 } println("after exception...") // Scala 这里就是用Break类的breakable方法把try-catch进行了封装 Breaks.breakable( for (i <- 0 until 5) { if (i == 3) Breaks.break() println(i) } ) /** * 可以直接引入Break的所有资源,这样可以省略写法 * import scala.util.control.Breaks._ */ breakable( for (i <- 0 until 5) { if (i == 3) break() println(i) } )