Scala 中有 while, do while, for 循环
这里拿常用的 for 循环来讲
常用的 for 循环形式有两种
前后闭合 (包括1 和 3)
for(i <- 1 to 3){ // 这里的 1 to 3 也可以是一个集合
print(i + " ")
}
前闭后开(包括1 不包括 3)
for(i <- 1 until 3) {
print(i + " ")
}
循环守卫
保护式为 true 则进入循环体内部,为 false 则跳过
示例:
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
多变量
Scala 中支持多变量的循环条件, 可以用来做嵌套循环的简化形式
这里没有关键字,所以范围后一定要加;来隔断逻辑
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)
}
上面的代码等价于
for (i <- 1 to 3) {
for (j <-1 to 3) {
println("ok")
}
}
循环返回值
Scala 中支持使用 yield 对循环结果进行迭代计算
val res = for(i <- 1 to 10) yield i * 2
将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字,yield 可以写代码块
使用 { } 代替 ( )
for(i <- 1 to 3; j = i * 2) {
println(" i= " + i + " j= " + j)
}
// 可以写成:
for {i <- 1 to 3
j = i * 2} {
println(" i= " + i + " j= " + j)
}
第二种形式在源码中很常见
- { } 和 ( ) 对于for表达式来说都可以
- for 推导式有一个不成文的约定:当 for 推导式仅包含单一表达式时使用圆括号,当其包含多个表达式时使用大括号
- 当使用 { } 来换行写表达式时,分号就不用写了
控制步长
示例: 遍历 1-10, 步长为 3
//方式 1 使用 Range, 它是一个集合
for (i <- Range(1,10,3)) { //until
println("i=" + i)
}
//方式 2 使用守卫 [推荐]
for (i <- 1 to 10 if i % 3 == 1 ) {
println("i=" + i)
}
循环的中断
Scala 为了更好的适应函数化编程, 内置控制结构特地去掉了 break 和 continue
那么怎么跳出循环呢? 有两种常用方式
//使用 breakable
breakable {
for (i <- 1 to 900000) {
if (i == 99) {
break()
}
println("i=" + i)
}
}
println("程序继续....")
//使用循环守卫
sum = 0
var flag = true
for (i <- 1 to max if flag == true) {
sum += i
if (sum > 20) {
println("使用的是循环守卫机制 当前的i=" + i)
flag = false
}
}
对于 continue, 则可以使用if – else 或是 循环守卫实现continue的效果
for (i <- 1 to 10 if (i != 4 && i != 5)) {
println("i=" + i)
}