Scala学习笔记(3)——流程控制

一、分支控制 if-else

一般的if-else使用与C和Java里的一样,不过Scala有一个不同之处:其分支语句可以有返回值

    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("老年")
      age
    }
    println("result: " + result)

实现类似Java中三元运算符的功能

val res2 = if(age >= 18) "成年" else "未成年"

二、For 循环控制

Scala 也为 for 循环这一常见的控制结构提供了非常多的特性,这些 for 循环的特性被称为 for 推导式或 for 表达式。

1.范围数据循环(To)

for(i <- 1 to 3){
 print(i + " ")
}
println()

其中1 to 3是1.to(3)的简写

2.范围数据循环(Until)

until与to的区别是until表示前闭合后开的范围,1 until 3不包括3

for(i <- 1 until 3) {
 print(i + " ")
}
println()

其中1 until 3是1.until(3)的简写

3.循环守卫

循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环体内部,为 false 则跳过,类似于 Java中的continue。

for(i <- 1 to 3 if i != 2) {
 print(i + " ")
}
println()

4.循环步长

循环步长表示每次循环下标增加的数量,不设置则步长默认为1

还可以通过步长设为负数实现倒序输出,设置by -1就可以实现和reverse同样的功能

需求:输出 1 到 10 以内的所有奇数

for (i <- 1 to 10 by 2) {
println("i=" + i)
}

输出结果

i=1
i=3
i=5
i=7
i=9

为了兼容Java,Scala中同样有While 和 do…While 循环控制,但是并不推荐使用,因为 while 中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量,而变量需要声明在 while 循环的外部,那么就等同于循环的内部对外部的变量造成了影响,所以不推荐使用,而是推荐使用 for 循环。

三、循环中断

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

1.采用异常的方式退出循环

def main(args: Array[String]): Unit = {
 try {
 for (elem <- 1 to 10) {
 println(elem)
 if (elem == 5) throw new RuntimeException
 }
 }catch {
 case e =>
 }
 println("正常结束循环")
}

2.采用 Scala 自带的函数,退出循环

Breaks.breakable还是对抛出异常的包装

import scala.util.control.Breaks
def main(args: Array[String]): Unit = {
 Breaks.breakable(
 for (elem <- 1 to 10) {
 println(elem)
 if (elem == 5) Breaks.break()
 }
 )
 println("正常结束循环")
}

3. 对 break 进行省略

上述break调用还可以简化

import scala.util.control.Breaks._
object TestBreak {
 def main(args: Array[String]): Unit = {
 
 breakable {
 for (elem <- 1 to 10) {
 println(elem)
 if (elem == 5) break
 }
 }
 
 println("正常结束循环")
 } }
上一篇:循环队列


下一篇:前端面试题(十)