【Scala】02 循环

 

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)
  }
)

 

【Scala】02 循环

上一篇:Docker进阶:容器卷、DockerFile、Docker网络原理


下一篇:5:张量的基本运算