Scala流程控制
流程控制
分支控制
让程序有所选择的进行执行,分支控制有三种:单分支、双分支、多分支
单分支
if (条件表达式) {
// 执行代码块
}
当条件表达式为true时,就会执行 {} 的代码
双分支
多分支
package chapter04
import scala.io.StdIn
object Test01_IfElse {
def main(args: Array[String]): Unit = {
print("请输入您的年龄:")
val age: Int = StdIn.readInt()
// 单分支
if (age > 18) {
println("成年")
}
println("====================")
// 双分支
if (age >= 18) {
println("成年")
} else {
println("未成年")
}
// 多分支
if (age <= 6) {
println("童年")
} else if(age <= 18) {
println("青少年")
} else if(age < 40) {
println("青年")
} else {
println("老年")
}
}
}
返回值*
Scala中,分支表达式会有一个返回值。这个返回值,默认是执行的分支语句中的最后一句话。
package chapter04
import scala.io.StdIn
object Test01_IfElse {
def main(args: Array[String]): Unit = {
// 返回值
val sex: Char = '男'
val result = if (sex == '男') {
println('男')
} else if(sex == '女') {
println('女')
} else {
println("不可告人的秘密")
}
println(s"result: ${result}")
var resultStr: String = if (sex == '男') {
println('男')
"男"
} else if(sex == '女') {
println('女')
"女"
} else {
println("不可告人的秘密")
"不可告人的秘密"
}
println(s"resultStr: ${resultStr}")
}
}
嵌套分支
if语句中可以嵌套if语句
for循环控制
Scala也为for循环这一常见的控制结构提供了非常多的特性,这些for循环的特性被称为for推导式或for表达式。
范围数据循环To
基本语法
for(i < -1 to 3) {
// 代码
}
范围数据循环Unitl
循环守卫
基本语法
for(i <- 1 to 3 if i != 2) {
// 代码
}
循环守卫,即循环保护式。保护式为true则进入循环内部;为false则跳过,类似于continue。
所以,上面的代码等价于
for (i <- 1 to 3) {
if(i != 2) {
// 代码
}
}
循环步长
嵌套循环
基本语法
for(i <- 1 to 3; j <- 1 to 3) {
// 代码
}
此语法等价于:
for(i <- 1 to 3) {
for(j <- 1 to 3) {
// 代码
}
}
引入变量
基本语法
for(i <- 1 to 3; j = 4 - i) {
// 代码
}
for推断式一行中有多个表达式时,所以要加;
来阻断逻辑
for推导式有一个不成文的约定:当for推导式仅包含单一表达式时使用圆括号。
循环返回值
将遍历过程中处理的结果返回到一个新的Vector集合中,使用yield关键字。
基本语法
val res = for(i <- 1 to 10) yield i
println(res)
开发中很少这样使用。
倒序打印
while循环控制
while和do...while的使用和Java语言中用法相同
while
循环条件是返回一个布尔值的表达式
while循环是先判断再执行语句
与for语句不同,while语句没有返回值,即整个while语句结果是Unit类型。
因为while中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免使用变量,而变量需要生命在while循环的外部,那么就等同于循环的内部对外部的变量造成了影响,所以不推荐使用。
do...while
package chapter04
object Test05_WhileLoop {
def main(args: Array[String]): Unit = {
var a: Int = 10
while (a >= 1) {
println("This is a while loop:" + a)
a -= 1
}
var b: Int = 0
do {
println("This is a do while loop:" + b)
b += 1
} while (b > 0)
}
}
循环中断
Scala 内置控制结构特地去掉了break和continue,是为了更好的适应函数式编程,推荐使用函数式的风格解决break和continue的功能,而不是一个关键字。Scala中使用breakable控制结构来实现break和continue 功能。
package chapter04
import scala.util.control.Breaks
object Test06_Break {
def main(args: Array[String]): Unit = {
// 采用抛出异常的方式,退出循环
try {
for (i <- 0 until 5) {
if (i == 3) {
throw new RuntimeException
}
println(i)
}
} catch {
case e: RuntimeException => // 什么都不做,只是抛出异常,退出循环
}
println("循环结束")
// 2. 使用Scala中Breaks类中的break方法,实现异常的抛出和捕捉
Breaks.breakable(
for (i <- 1 until 10) {
if (i == 3)
Breaks.break()
println(i)
}
)
}
}