0%

scala流程控制

scala流程控制

主要有三大流程控制语句

  • 顺序控制
  • 分支控制
  • 循环控制

顺序控制

顺序控制就是按照代码所写顺序从上到下依次执行,这个和java是一样的

分支控制

分支控制与java也大致相同,使用if…else if…else来执行

1
2
3
4
5
6
7
8
9
10
val age = 19
if(age > 22){
println("这么大岁数了,什么时候结婚生孩子呀")
} else if(age > 18) {
println("有对象了吗")
} else if(age > 16) {
println("好好学习,可不能早恋耽误学习")
} else {
println("你还小")
}

有时候有些if语句没有输出值,但是在scala中,每个表达式都应该有某种值。这个可以使用Unit类,写做()。

1
if(x > 0) 1 else ()

这个()可以作为表示无有用值的占位符

循环控制

for循环

scala中的for循环与java中的for循环写法还是差距很大的

范围数据循环方式

使用to,左闭右闭,包含start和end

1
2
3
4
5
6
7
8
// 可以使用 变量 <- 表达式的形式 提供多个生成器,多个使用分号隔开
// i表示循环的变量
// <- 将数值赋给i
// 1 to 3 从1-3循环,to关键字,从start到end,这个是前后闭合的
for (i <- 1 to 3) {
//1 2 3
print(i + "\t")
}

使用until,左闭右开,包含start不包含end

1
2
3
4
for (i <- 1 until 3) {
//1 2
print(i + "\t")
}

也可以对集合进行遍历

1
2
3
4
var myArray:Array[Int] = Array(1,3,5,7,9)
for(item <- myArray){
print(item+"\t")
}

for循环中的循环守卫

在遍历的同时增加判断条件,如果判断条件为true,则进入循环,否则,跳过此次循环,进行下一次循环,相当于continue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 每个生成器都可以带一个守卫,以if开头的boolean表达式
// 只有i不等于2的时候才会执行
for (i <- 1 to 3 if i != 2) {
// 1 3
print(i+"\t")
}

// 上面得操作等价于
for (i <- 1 to 3) {
if (i != 2){
// 1 3
print(i+"\t")
}
}

for循环中引入变量

可以在遍历元素的同时,对元素进行其他操作

1
2
3
4
5
// 注意两个操作之间有; 不然编译器不知道逻辑
for (i <- 1 to 3; j = i + 4) {
// 5 6 7
print(j + "\t")
}

while循环

while循环与java的用法相似,不过scala不推荐使用while循环,而推荐使用for循环(由于scala不推荐使用外部变量)

1
2
3
4
5
var i = 0
while (i < 10) {
println("line" + i)
i += 1
}

do…while循环

do…while循环与java用法也相似,先执行再判断

1
2
3
4
5
var i = 0;
do {
println("line" + i)
i += 1
} while (i < 10)

循环的中断

scala中取消了关键字break和continue,而采用了函数的方式来实现了循环的中断来代替break和continue

break()函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 使用break()需要引入
import scala.util.control.Breaks._


for(i<- 1 to 10){
if(i % 5 == 0){
// def break(): Nothing = throw breakException
break()
}
print("i="+i+"\t")
}

// i=1 i=2 i=3 i=4 Exception in thread "main" scala.util.control.BreakControl

可以看到break()中就是抛出一个异常,而由于异常没有处理,所以导致执行中断了,但是这个操作不只是中断了循环,直接将程序中断了

可以使用breakable()来捕获该异常,这样后续程序就可以执行了

1
2
3
4
5
6
7
8
9
10
11
12
// def breakable(op: => Unit): Unit =
// try op catch { case ex: BreakControl if ex eq breakException => }
// breakable是专门来捕获breakException异常的,并且捕获之后什么都不做
breakable(
for(i<- 1 to 10){
if(i % 5 == 0){
// def break(): Nothing = throw breakException
break()
}
print("i="+i+"\t")
}
)

欢迎关注我的其它发布渠道