学习链接:https://www.bilibili.com/video/BV1Xh411S7bP?p=34&spm_id_from=pageDriver


1 分支控制

  1. object Test01_ifelse {
  2. def main(args: Array[String]): Unit = {
  3. val age: Int = StdIn.readInt()
  4. // 单分支
  5. if (age >= 18) {
  6. println("成年")
  7. }
  8. // 双分支
  9. if (age >= 18) {
  10. println("成年")
  11. } else {
  12. println("未成年")
  13. }
  14. // 多分支
  15. if (age <= 6) {
  16. println("童年")
  17. } else if (age < 18) {
  18. println("青少年")
  19. } else if (age < 35) {
  20. println("青年")
  21. } else if (age < 60) {
  22. println("中年")
  23. } else {
  24. println("老年")
  25. }
  26. }
  27. }
// 分支语句的返回值
val result: String = if (age <= 6) {
  println("童年")
  "童年"
} else if (age < 18) {
  println("青少年")
  "青少年"
} else if (age < 35) {
  println("青年")
  "青年"
} else if (age < 60) {
  println("中年")
  "中年"
} else {
  println("老年")
  "老年"
}
println("result:" + result) // result:中年
// 分支语句的返回值
// Int和String的公共父类Any
val result: Any = if (age <= 6) {
  println("童年")
  "童年"
} else if (age < 18) {
  println("青少年")
  "青少年"
} else if (age < 35) {
  println("青年")
  age
} else if (age < 60) {
  println("中年")
  age
} else {
  println("老年")
  "老年"
}
println("result:" + result) // result:19

Scala没有三元条件运算符

2 For循环

2.1 范围遍历

object Test02_ForLoop {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 10) {
      println(i + ".hello world")
    }
    // 等同于
    for (i <- 1.to(10)){
      // 1.to(10)返回的是Range.Inclusive,包含边界[1,10]
      println(i + ".hello world")
    }

    // 用伴生对象,1<=i<10,步长默认是1
    for (i <- Range(1, 10)) {
      println(i + ".hello world")
    }

    // i <- 1 until 10
    for (i <- 1 until 10) {
      println(i + ".hello world")
    }
  }
}

2.2 集合遍历

object Test02_ForLoop {
  def main(args: Array[String]): Unit = {
    // 2. 集合遍历
    for (i <- Array(12, 34, 53)) {
      println(i)
    }
    for (i <- List(12, 34, 53)) {
      println(i)
    }
    for (i <- Set(12, 34, 53)) {
      println(i)
    }
  }
}

2.3 循环守卫

// 3. 循环守卫
for(i <- 1 to 3 if i != 2) {
  println(i)
}

2.4 循环步长

// 4. 循环步长
for (i <- 1 to 10 by 2) {
  println(i)
}
// 倒序一
for (i <- 30 to 1 by -2) {
  println(i)
}
// 倒序二
for (i <- 1 to 10 reverse) {
  print(i + " ") // 10 9 8 7 6 5 4 3 2 1 
}
  • 步长step不能为0

    for (i <- 1 to 10 by 0) {
    print(i + " ") 
    }
    

    QQ截图20220527145005.png

  • 步长step为0.5,最好用BigDecimal,否则可能精度缺失

    for (i <- 1.0 to 5.0 by 0.5) {
    print(i + " ") // 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 
    }
    

    2.5 嵌套循环

    // 4. 循环嵌套
    for (i <- 1 to 3) {
    for (j <- 1 to 3) {
      println("i= " + i + ",j=" + j)
    }
    }
    
    for (i <- 1 to 3; j <- 1 to 3) {
    println("i= " + i + ",j=" + j)
    }
    
  • 乘法表

    def main(args: Array[String]): Unit = {
      for (i <- 1 to 9) {
        for (j <- 1 to i) {
          print(s"$j * $i = ${i * j} \t")
        }
        println()
      }
      // 简写
      for (i <- 1 to 9; j <- 1 to i) {
        print(s"$j * $i = ${i * j} \t")
        if (j == i) println()
      }
    }
    

    2.6 引入变量

    ```scala // 引入变量 for (i <- 1 to 10; j = 10 - i) { println(“i = “ + i + “,j = “ + j) }

for { i <- 1 to 10 j = 10 - i } { println(“i = “ + i + “, j = “ + j) }

<a name="jdedc"></a>
## 2.7 循环返回值
将遍历过程中处理的结果返回到一个新Vector集合中,使用yeild关键字
```scala
val b: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i
println("b=" + b) // b=Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val b: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * i
println("b=" + b) // b=Vector(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)

3 While循环

// while
var a: Int = 10
while (a >= 1) {
  println("this is a while loop:" + a)
  a -= 1
}
def main(args: Array[String]): Unit = {
  var b: Int = 0
  do {
    println("this is a do-while loop:" + b)
    b -= 1
  } while (b > 0)
}

while没有返回值,while语句的结果是Unit类型() 循环变量声明在while的外部,等同于循环的外部,那么就等同于循环的内部对外部的变量 造成了影响,所以不推荐使用,而是 推荐使用 for 循环

4 循环中断

Scala没有break和continue

object Test06_Break {
  def main(args: Array[String]): Unit = {
    // 1. 采用抛出异常方式,退出循环
    try {
      for (i <- 0 until 5) {
        if (i == 3)
          throw new RuntimeException
        println(i)
      }
    } catch {
      case e: Exception => // 什么都不做,退出循环
    }
    println("循环外代码")

    // 2. 使用Scala中的Breaks类的break方法,实现异常的抛出和捕捉
    Breaks.breakable(
      for(i <- 0 until 5) {
        if (i == 3)
          Breaks.break()
      }
    )
  }
}
import scala.util.control.Breaks._

object Test06_Break {
  def main(args: Array[String]): Unit = {
    // 2. 使用Scala中的Breaks类的break方法,实现异常的抛出和捕捉
    breakable(
      for(i <- 0 until 5) {
        if (i == 3)
        break()
      }
    )
  }
}