1. IfElse

1.1 单分支

单独一个if

  1. package chapter04
  2. import scala.io.StdIn
  3. object Test01_IfElse {
  4. def main(args: Array[String]): Unit = {
  5. println("请输入您的年龄:")
  6. val age: Int = StdIn.readInt()
  7. // 1. 单分支
  8. println("========= 单分支 =========")
  9. if (age >= 18) {
  10. println("成年")
  11. }
  12. }
  13. }

1.2 双分支

标准的if-else

  1. package chapter04
  2. import scala.io.StdIn
  3. object Test01_IfElse {
  4. def main(args: Array[String]): Unit = {
  5. println("请输入您的年龄:")
  6. val age: Int = StdIn.readInt()
  7. //2. 双分支
  8. println("========= 双分支 =========")
  9. if (age >= 18) {
  10. println("成年")
  11. } else {
  12. println("未成年")
  13. }
  14. }
  15. }

1.3 多分支

if - else if - else,也是很常见的结构

  1. package chapter04
  2. import scala.io.StdIn
  3. object Test01_IfElse {
  4. def main(args: Array[String]): Unit = {
  5. println("请输入您的年龄:")
  6. val age: Int = StdIn.readInt()
  7. // 3. 多分支
  8. println("========= 多分支 =========")
  9. if (age <= 6) {
  10. println("童年")
  11. } else if (age < 18) {
  12. println("青少年")
  13. } else if (age < 35) {
  14. println("青年")
  15. } else if (age < 60) {
  16. println("中年")
  17. } else {
  18. println("老年")
  19. }
  20. }
  21. }

1.4 分支的返回值

一切皆对象。那么 if 判断语句到底会给我们返回什么东西呢?
我们甚至还能指定返回值

  1. package chapter04
  2. import scala.io.StdIn
  3. object Test01_IfElse {
  4. def main(args: Array[String]): Unit = {
  5. println("请输入您的年龄:")
  6. val age: Int = StdIn.readInt()
  7. // 分支语句的返回值
  8. // 默认是Unit,但是我们可以指定返回值
  9. println("========= 分支返回值 =========")
  10. val result: Any = if (age <= 6) {
  11. println("童年")
  12. "童年"
  13. } else if (age < 18) {
  14. println("青少年")
  15. "青少年"
  16. } else if (age < 35) {
  17. println("青年")
  18. "青年"
  19. } else if (age < 60) {
  20. println("中年")
  21. age
  22. } else {
  23. println("老年")
  24. age
  25. }
  26. println("result: " + result)
  27. }
  28. }

1.5 三元运算符

这里面没有类似 Java 的三元运算符 a?b:c ,但是我们有其他写法。

  1. package chapter04
  2. import scala.io.StdIn
  3. object Test01_IfElse {
  4. def main(args: Array[String]): Unit = {
  5. println("请输入您的年龄:")
  6. val age: Int = StdIn.readInt()
  7. // JAVA 中三元运算符 a?b:c
  8. val res1: String = if (age >= 18) {
  9. "成年"
  10. } else {
  11. "未成年"
  12. }
  13. // 另一种写法,更简洁
  14. val res2 = if (age >= 18) "成年" else "未成年"
  15. }
  16. }

1.6 嵌套分支

if 里面套 if ,没啥好说的。

  1. package chapter04
  2. import scala.io.StdIn
  3. object Test01_IfElse {
  4. def main(args: Array[String]): Unit = {
  5. println("请输入您的年龄:")
  6. val age: Int = StdIn.readInt()
  7. // 5. 嵌套分支
  8. // if 里面套 if
  9. println("========= 嵌套分支 =========")
  10. if (age >= 18) {
  11. println("成年")
  12. if (age >= 35) {
  13. if (age > 60) {
  14. println("老年")
  15. } else {
  16. println("中年")
  17. }
  18. }
  19. } else {
  20. println("未成年")
  21. if (age <= 6) {
  22. println("童年")
  23. } else {
  24. println("青少年")
  25. }
  26. }
  27. }
  28. }

2. WhileLoop

2.1 while

和普通的While一致。

  1. package chapter04
  2. object Test05_WhileLoop {
  3. def main(args: Array[String]): Unit = {
  4. // while
  5. var a: Int = 10
  6. while (a >= 1) {
  7. println("This is a while loop: " + a)
  8. a -= 1
  9. }
  10. }
  11. }

2.2 do-while

do-while的形式,会先执行一次,再进入while判断。

  1. package chapter04
  2. object Test05_WhileLoop {
  3. def main(args: Array[String]): Unit = {
  4. // 还是会输出一次
  5. var b: Int = 0
  6. do {
  7. println("This is a do-while loop:" + b)
  8. b -= 1
  9. } while (b > 0)
  10. }
  11. }

3. ForLoop

3.1 范围遍历

注意对比Java的情况。深入一下 torange 以及 until 的源码。

  1. package chapter04
  2. import scala.math.BigDecimal.double2bigDecimal
  3. object Test02_ForLoop {
  4. def main(args: Array[String]): Unit = {
  5. /* java for语法:
  6. for (int i = 0; i < 10; i++){
  7. System.out.println("Hello World")
  8. }
  9. */
  10. // 1. 范围遍历
  11. for (i <- 1 to 5) {
  12. println(i + "hello world")
  13. }
  14. /* 更面向对象一些
  15. 这里实际上点进 to ,里面不是Int的方法而是RichInt的方法。
  16. 这里涉及到了 Int 到 RichInt 的隐式转换。
  17. 这里我们得到了 Range下面的Inclusive
  18. */
  19. println("===========分割线========")
  20. for (i <- 1.to(5)) {
  21. println(i.+(".hello world"))
  22. }
  23. // 如果要不包含边界呢?
  24. // 直接声明range
  25. println("===========分割线========")
  26. for (i <- Range(1, 10)) {
  27. println(i.+(".hello world"))
  28. }
  29. println("===========分割线========")
  30. for (i <- 1 until 5) {
  31. println(i + "hello world")
  32. }
  33. }
  34. }

3.2 集合遍历

如果遍历对象是一个Array、List之类的呢?

  1. package chapter04
  2. import scala.math.BigDecimal.double2bigDecimal
  3. object Test02_ForLoop {
  4. def main(args: Array[String]): Unit = {
  5. // 2.集合遍历
  6. println("\n===========集合遍历========")
  7. for (i <- Array(12, 34, 53)) {
  8. println(i)
  9. }
  10. for (i <- List(11, 33, 44)) {
  11. println(i)
  12. }
  13. for (i <- Set(112, 333, 22)) {
  14. println(i)
  15. }
  16. }
  17. }

3.3 循环守卫

Scala中不使用 continue关键字,而是用 if 来代替

  1. package chapter04
  2. import scala.math.BigDecimal.double2bigDecimal
  3. object Test02_ForLoop {
  4. def main(args: Array[String]): Unit = {
  5. // 3. 循环守卫
  6. println("\n===========循环守卫========")
  7. for (i <- 1 to 10) {
  8. if (i != 5) {
  9. println(i)
  10. }
  11. }
  12. for (i <- 1 to 10 if i != 5) {
  13. println(i)
  14. }
  15. }
  16. }

3.4 循环步长

循环中怎么控制步长?注意看 by 的源码

  1. package chapter04
  2. import scala.math.BigDecimal.double2bigDecimal
  3. object Test02_ForLoop {
  4. def main(args: Array[String]): Unit = {
  5. // 4. 循环步长
  6. // 看看源码,其实是通过 Range 实现的
  7. // step不能为0
  8. println("\n===========循环步长========")
  9. for (i <- 1 to 10 by 2) { // 看看源码,by 其实是通过 Range 实现的
  10. println(i)
  11. }
  12. for (i <- 10 to 1 by -2) { // 倒序
  13. println(i)
  14. }
  15. // Double 弃用,使用BigDecimal
  16. for (i <- 1.0 to 3.0 by 0.5) {
  17. println(i)
  18. }
  19. }
  20. }

3.5 循环嵌套

循环中套循环。当然也有更扁平的写法。

  1. package chapter04
  2. import scala.math.BigDecimal.double2bigDecimal
  3. object Test02_ForLoop {
  4. def main(args: Array[String]): Unit = {
  5. // 5. 循环嵌套
  6. println("\n===========嵌套循环========")
  7. for (i <- 1 to 3) {
  8. for (j <- 1 to 3) {
  9. println("i = " + i + " ,j= " + j)
  10. }
  11. }
  12. println("\n===========嵌套循环2========")
  13. for (i <- 1 to 2; j <- 1 to 4) {
  14. println("i = " + i + " ,j= " + j)
  15. }
  16. }
  17. }

3.6 循环引入变量

循环中引入一个相关变量。

  1. package chapter04
  2. import scala.math.BigDecimal.double2bigDecimal
  3. object Test02_ForLoop {
  4. def main(args: Array[String]): Unit = {
  5. // 6. 循环引入变量
  6. println("\n==========循环引入变量===========")
  7. for (i <- 1 to 10) {
  8. val j = 10 - i
  9. println("i = " + i + " ,j= " + j)
  10. }
  11. for (i <- 1 to 10; j = 10 - i) {
  12. val j = 10 - i
  13. println("i = " + i + " ,j= " + j)
  14. }
  15. for {
  16. i <- 1 to 10
  17. j = 10 - i
  18. } {
  19. println("i = " + i + " ,j= " + j)
  20. }
  21. }
  22. }

3.7 循环返回值

循环的返回值,在Scala中一般默认为空。但是我们可以使用 yield 关键字。

  1. package chapter04
  2. import scala.math.BigDecimal.double2bigDecimal
  3. object Test02_ForLoop {
  4. def main(args: Array[String]): Unit = {
  5. // 7. 循环返回值
  6. // for 循环在默认情况下返回值都为空
  7. println("\n==========循环返回值===========")
  8. val a: Unit = for (i <- 1 to 10) {
  9. println(i)
  10. }
  11. println("a = " + a) // 空括号
  12. val b:IndexedSeq[Int] = for (i <- 1 to 10) yield i
  13. println("b = " + b)
  14. }
  15. }

4. Break

4.1 Java中的Break

  1. public class TestBreak {
  2. public static void main(String[] args) {
  3. try {
  4. for (int i = 0; i < 5; i++) {
  5. if (i == 3)
  6. // break;
  7. throw new RuntimeException();
  8. System.out.println(i);
  9. }
  10. } catch (Exception e) {
  11. // 什么都不做,只是退出循环
  12. }
  13. System.out.println("这是循环外的代码");
  14. }
  15. }

4.2 普通抛异常

Scala里面没有所谓的 break 关键字来跳出循环,但是我们可以通过抛异常的方式来达到同样的效果。

  1. package chapter04
  2. object Test06_Break {
  3. def main(args: Array[String]): Unit = {
  4. println("========= 抛异常退出循环 ========")
  5. // 1. 采用抛异常的形式退出循环
  6. try {
  7. for (i <- 0 until 5) {
  8. if (i == 3)
  9. throw new RuntimeException
  10. println(i)
  11. }
  12. } catch {
  13. case e: Exception => // 什么都不做,只是退出循环
  14. }
  15. println("这是循环外的代码")
  16. }
  17. }

4.3 使用Breaks类

上面那种写法还是有点累,我们现在使用一个更简单的写法。

  1. package chapter04
  2. import scala.util.control.Breaks
  3. import scala.util.control.Breaks.break
  4. object Test06_Break {
  5. def main(args: Array[String]): Unit = {
  6. println("========= 抛异常退出循环 ========")
  7. // 2. 使用Scala中 Breaks 类的 break 方法,实现异常的抛出和捕捉
  8. // 不使用关键字,而是用方法来做Break,这样更面向对象
  9. Breaks.breakable(
  10. for (i <- 0 until 5) {
  11. if (i == 3)
  12. Breaks.break()
  13. println(i)
  14. }
  15. )
  16. Breaks.breakable(
  17. for (i <- 0 until 5) {
  18. if (i == 3)
  19. break()
  20. println(i)
  21. }
  22. )
  23. println("这是循环外的代码")
  24. }
  25. }