Scala 流程控制 之 for 循环

格式

for (i <- 0 to|until 5){
    循环体
}

for (i <- 1 to 5){
    println(s"i=$i")
}
  • i :i 是接收 for循环次数的 变量,不用声明是因为 Scala 能自动推断
  • to : 是 [ 0, 5],是前后都包含的意思
  • until : 是 [ 0, 5),是前包含后不包含的意思

详解 to 和 until 到 Range() 控制循环步长

1.to(5) -简写-> 1 to 5

0.until(5) -简写-> 0 until 5

until 和 to 的源码里都调用了一个 Rang() 的方法,所以 for 循环还能这样写

for (i <- Range(0,5)){
       println(s"第 $i 次")
    }

----------------------
第 0 次
第 1 次
第 2 次
第 3 次
第 4 次

Range() 控制循环步长

for (i <- Range(0,5,2)){
       println(s"第 $i 次")
    }
----------------------
第 0 次
第 2 次
第 4 次

小案例

一层循环打印九层妖塔

for (i <- Range(1,18,2)){
    println(" "*((18-i)/2) + "*"*i + " "*((18-i)/2) )
     }

mark

守卫循环

循环守卫: 所谓循环守卫就是 加一个判断,成立执行循环体,不成立跳过本次循环

跟 Java 和 Python 中的 continue 一样

for (i <- 1 to 6 if i % 2 == 0){
        println(s"i = $i")
    }
-------------------------------
i = 2
i = 4
i = 6

其实也可以等价于

for (i <- 1 to 6 ){
    if (i % 2 == 0) {
        println(s"i = $i")
    }

引入变量

格式

// 原本格式,分号隔开
for (i <- 1 to 5; f = i % 2){
    println(s"i = $i: f = $f")
}

// 写一行 ; 隔开逻辑,注意大括号
for {i <- 1 to 5 ; f = i % 2}{
    println(s"i = $i: f = $f")
}

// 不要分号  换行 隔开逻辑
for {i <- 1 to 5 
        f = i % 2}{
    println(s"i = $i: f = $f")
}

所以小案例变换

// 要分号
for {i <- Range(1,18,2); j = ((18-i)/2)} {
        println(" "*j + "*"*i + " "*j )
    }

// 不要分号 代码块
for {
        i <- Range(1,18,2)
        j = ((18-i)/2)
} {
        println(" "*j + "*"*i + " "*j )
    }

for 的返回值

一般情况 for 都没有返回值

// for 的返回值 一般情况 for 的返回值都是 Unit
val res: Unit = for (i <- 1 to 5) {
        "abc"
    }

yeild 特殊情况

它会把结果返回成一个集合

val value = for (i <- 1 to 5) yield i
println(value)
-------------------------------------
Vector(1, 2, 3, 4, 5)

for 跳出循环

Scala 是完全面向对象的语言,所以没有 break。

Scala 使用的 产生一个特定的异常,然后进行类似异常处理来保证后面代码的正常运行

// 产生异常,结束循环
for (i <- 1 to 5) {
    if (i == 3) {
        Breaks.break()
        }
    println(s"s = $i")
    }
----------------------
s = 1
s = 2
Exception in thread "main" scala.util.control.BreakControl

对异常进行特定处理,保证后面正常运行

Breaks.breakable ( // 这对小括号可以换成 大括号(表示包裹代码块)
    for (i <- 1 to 5) {
        if (i == 3) {
            Breaks.break()
            }
        println(s"s = $i")
    }
)
println("跳出循环")
---------------------------
s = 1
s = 2
跳出循环
发表评论 / Comment

用心评论~