Scala 优雅入门 (三) for 循环

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)
}

Scala 优雅入门 (四) 函数式编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值