scala的基本语法(二):流程控制
一、If-else
① 单分支
if(条件表达式) 没有else
② 双分支
类似java 三元运算符 if(条件表达式) -----else----
③多分支
if (条件表达式) else if (条件表达式) else
二、 For循环
1.普通for
for(i <- 0 to n)
for (i<- 0 until n)
- to 区间是开区间,until 左闭右开
- for循环的变量i与其他同名变量i不冲突(同java),作用域持续到循环结束;该变量类型是集合的元素类型
2.高级for循环 循环控制
① 循环守卫
-
即循环保护式(也称条件判断式,守卫)。保护式为true则进入循环体内部,为false则跳过,类似于continue
-
每个生成器都可以带上守卫,以if开头的Boolean表达式,注意if前面没有分号
-
变量<-表达式的形式可以提供多个生成器,之间用**;**隔开。
-
可以使用任意多的定义 ,引入可以在循环中使用的变量:
for(i<- 1 to 3;from=4-i;j<- from to 3)print(f"${10*i+j}%3d")//书上的例子 for (i <- 1 to 9; y <- 1 to i) {print(f"$i%dX$y%d=$i * y%d+\t") ;if (i == y) println()} //99乘法表 for (i <- 1 to 9; y <- 1 to i; n = i * y) if (i == y) println(i + "X" + y+"=" + n) else print(f"$i%dX$y%d=$n%d+\t")//99乘法表方式二
② break
参考后面Break
③ 步长控制Range、 By、indices、reverse
for(i <- Range(1,10,2))
for(i<-1 to 10 by 2)
for(i<-1 to 10 reverse)
- 此处的range区间为左开右闭
- 循环守卫也可以实现步长控制
④ For推导式(For comprehension)
for循环中的 yield 后可以写代码块,yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scala中for循环是有返回值的。如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是List,以此类推。生成的集合与他的第一个生成器是类型兼容的。
scala> val arr = Array(1, 2, 3, 4, 5)
scala> for (e <- arr) yield e
res1: Array[Int] = Array(1, 2, 3, 4, 5)//数组
val res = for(i <- 1 to 10) yield i * 2//集合
println(res)
Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
三 、While循环
① while
while (循环条件) {
循环体(语句)
循环变量迭代
}
②do while
do{
循环体(语句)
循环变量迭代
} while(循环条件)
Break
两种方法breakable(高阶函数),Breaks.break()
1.import util.control.Breaks
直接使用Breaks.break()//虽然中止了,但会报异常
2.import util.control.Breaks._
//使用 breakable函数 需要将完整代码包裹
breakable {
break() //不会报错
}
Scala内置控制结构特地去掉了break和continue,是为了更好的适应函数化编程,推荐使用函数式的风格解决break和contine的功能,而不是一个关键字
注意的地方
-
Scala中任意表达式都是有返回值的,所以引入一个Unit类,写作(),表示无值的值。if 表达式不带else 等同于返回()——快学scala
-
与If语句不同,While语句本身没有值,即整个While语句的结果是Unit类型的()
-
因为while中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量 ,所以不推荐使用,推荐使用for循环
for 优化 ()
/ for(i <- 1 to 100 if flag) {
// sum += i
// if( sum > 20) {
// curI = i
// flag = false
// }