Scala控制流程

分支控制

if-else

  1. 单分支: if{}
  2. 双分支: if{} else{}
  3. 多分支: if{} else if{}
  • Scala 中的if-else有返回值的, 具体取决于满足条件的代码块的最后一行内容
  • Scala 中是没有三元运算符的, 但是可以用if-else代替

switch

Scala 中是没有switch的, 而是使用模式匹配来处理的

循环控制

for

Scala 中为for提供了很多的特性:

1. 范围数据循环 (to)

1
2
3
4
// 前后闭合: [1,3]
for (i <- 1 to 3) {
    println(i)
}

2. 范围数据循环 (until)

1
2
3
4
// 前闭后开: [1, 3)
for (i <- 1 until 3) {
    println(i)
}

3. 循环守卫

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for (i <- 1 to 3 if i != 2) {
  println(i)
}

// 上面的代码就相当于:
for (i <- 1 to 3) {
    if (i != 2) {
        println(i)
    }
}

4. 循环步长

1
2
3
for (i <- 1 to 10 by 2) {
    println(i)
}

5. 嵌套循环

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 因为没有关键字, 所以一定要加 `;` 来进行分割
for (i <- 1 to 3; j <- 1 to 3) {
    println("i=" + i + ", j=" + j)
}

// 上面的代码相当于:
for (i <- 1 to 3) {
    for (j <- 1 to 3) {
        println("i=" + i + ", j=" + j)
    }
}

6. 引入变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
for (i <- 1 to 3; j = 4 - i) {
    println("i=" + i + ", j=" + j)
}

// for 推导式有一个不成文的规定: 
// 1. 仅包含单一表达式时, 使用圆括号
// 2. 当包含多个表达式时, 一般每一行一个表达式, 并且用花括号
for {
    i <- 1 to 3
    j = 4 - i
} {
    println("i=" + i + ", j=" + j)	
}

7. 循环返回值

1
2
3
val res = for (i <- 1 to 5) yield { i * 2 }
// 输出 2, 4, 6, 8, 10
println(res)

8. 倒序

1
2
3
for (i <- 1 to 10 reverse) {
    println(i)
}

whiledo..while

Scala 中的whiledo..while和 Java 中的用法一致

while

  1. 循环条件是返回一个布尔值的表达式
  2. while先判断再执行
  3. for不同, while没有返回值, 即整个while语句的结果是Unit类型

do..while

  1. 循环条件是返回一个布尔值的表达式
  2. do..while先执行再判断

循环中断

Scala 内置控制结构特地去掉了breakcontinue. 是因为更好的适应函数式编程, 推荐使用函数式的风格解决breakcontinue, 而不是一个关键字. Scala 中使用breakable控制结构来实现breakcontinue功能.

异常的方式退出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def main(args: Array[String]): Unit = {
    try {
        for (elem <- 1 to 10) {
            println(elem)
            if (elem == 5) throw new RuntimeException
        }
    } catch {
        case e =>
    }
    println("结束循环")
}

Scala 自带函数退出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import scala.util.control.Breaks

def main(args: Array[String]): Unit = {
    Breaks.breakable(
        for (ele <- 1 to 10) {
            println(ele)
            if (ele == 5) Breaks.break()
        }
    )

    println("结束循环")
}

break进行省略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import scala.util.control.Breaks._

def main(args: Array[String]): Unit = {
    breakable(
        for (ele <- 1 to 10) {
            println(ele)
            if (ele == 5) break
        }
    )

    println("结束循环")
}

continue

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import scala.util.control.Breaks._

def main(args: Array[String]): Unit = {
    for (ele <- 1 to 10) {
        breakable(
            if (ele % 2 == 1)
            	break
            else
            	println(ele)
        )
    }

    println("结束循环")
}

这里的breakable和上面的区别是将其放入到了循环内部, 这样可以实现结束本次执行而不是整个循环结束, 从而实现continue的功能.

0%