Scala-03-流程控制
2020-04-04 本文已影响0人
chen_666
注意事项
- 如果大括号{}内的逻辑代码只有一行,大括号可以省略, 这点和java 的规定一样。
- Scala中任意表达式都是有返回值的,也就意味着if else表达式其实是有返回结果的,具体返回结果的值取决于满足条件的代码体的最后一行内容.
- 在scala中没有switch,而是使用模式匹配来处理
for循环控制
for(i <- 1 to 3){ // 这里的 1 to 3 也可以是一个集合
print(i + " ")
}
val list = List("北京", "广州", "深圳")
for (item <- list) {
println("item=" + item)
}
- i 表示循环的变量, <- 规定好 to 规定
- i 将会从 1-3 循环, 前后闭合 (包括1 和 3)
for(i <- 1 until 3) {
print(i + " ")
}
- 这种方式和前面的区别在于 i 是从1 到 (3-1)
- 前闭合后开的范围,和java的arr.length() 类似
循环守卫
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
//等价于
for (i<-1 to 3){
if ( i != 2) {
println(i+" ")
}
}
- 循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为true则进入循环体内部,为false则跳过,类似于continue
引入变量
for(i <- 1 to 3; j = 4 - i) {
print(j + " ")
}
//等价于
for (i <- 1 to 4) {
val j = 4 - i
println(s"i=${i} j=${j}")
}
嵌套循环
for(i <- 1 to 3; j <- 1 to 3) {
println(" i =" + i + " j = " + j)
}
没有关键字,所以范围后一定要加;来隔断逻辑
循环返回值
val res = for(i <- 1 to 10) yield i * 2
val res = for (i <- 1 to 10) yield (i * 2)
println("res=" + res)
val res2 = for (i <- 1 to 10) yield {
if (i % 2 == 1) {
i
}else {
()
}
}
将遍历过程中处理的结果返回到一个新Vector集合中,使用yield关键字,yield 可以写代码块.
1){}和()对于for表达式来说都可以
2)for 推导式有一个不成文的约定:当for 推导式仅包含单一表达式时使用圆括号,当其包含多个表达式时使用大括号
3)当使用{} 来换行写表达式时,分号就不用写了
控制步长
//说明 1: start
// 10: end 遍历到(end -1)
// 3: 表示step
for (i <- Range(1,10,3)) { //until
println("i=" + i)
}
while 循环
- while循环是先判断再执行语句
- 与If语句不同,While语句本身没有值,即整个While语句的结果是Unit类型的()
- 因为while中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量 ,而变量需要声明在while循环的外部,那么就等同于循环的内部对外部的变量造成了影响,所以不推荐使用,而是推荐使用for循环。(scala设计者理念:能使用for循环,就先考虑使用.)
while (n <= 10) {
println("hello,world" + n)
n += 1 //循环遍历的迭代
}
while循环的中断
breakable {
var n = 1
while (true) {
println("n=" + n)
n += 1
if (n == 18) {
break()
}
}
}
println("程序继续....")//会打印出来
breakable {
for (i <- 1 to 900000) {
if (i == 99) {
break()
}
println("i=" + i)
}
}
println("程序继续....")//也会打印出来
使用if-else 或者循环守卫实现continue的效果
for (i <- 1 to 10 if (i != 4 && i != 5)) {
println("i=" + i)
}
for(i <- 1 to 10){
if (i != 4 && i != 5) {
println("i=" + i)
}
}