scala之for循环

全栈开发私房菜

共 3718字,需浏览 8分钟

 ·

2021-06-21 08:46

scala之for循环的几种方式

第一种

i 表示循环的变量, <- 规定好 to 规定

i 将会从 1-3 循环, 前后闭合

for(i <- 1 to 3){

  print(i + " ")

}


第二种

这种方式和前面的区别在于 i 是从1 到 3-1

前闭合后开的范围,和java的arr.length() 类似

for(i <- 1 until 3) {

  print(i + " ")

}


第三种(循环守卫)

for(i <- 1 to 3 if i != 2) {

  print(i + " ")

}


这个代码等价于

for (i <- 1 to 3) {

       if (i != 2) {

              println(i+"")

       }

}


第四种(引入变量)

for(i <- 1 to 3; j = 4 - i) {

  print(j + " ")

}

没有关键字,所以范围后一定要加;来隔断逻辑

上面的代码等价

for ( i <- 1 to 3) {

  val j = 4 –i

  print(j+"")

}


第五种(嵌套循环)

for(i <- 1 to 3; j <- 1 to 3) {

  println(" i =" + i + " j = " + j)

}

上面的代码等价于

for ( i <- 1 to 3) {

    for ( j <- 1to 3){

        println(i + " " + j + " ")

    }

 }


第六种(循环返回值)

将遍历过程中处理的结果返回到一个新Vector集合中,使用yield关键字

val res = for(i <- 1 to 10) yield i

println(res)


第七种(会用花括号代替小括号)

{}和()对于for表达式来说都可以

for 推导式有一个不成文的约定:当for 推导式仅包含单一表达式时使用圆括号,当其包含多个表达式时使用大括号

当使用{} 来换行写表达式时,分号就不用写了

for(i <- 1 to 3; j =  i * 2) {

  println(" i= " + i + " j= " + j)

}


注意

    scala中去掉了break和continue,所以需要专门的中断语句去执行

    break()函数替代break,用breakable()将代码块包起来,可以让break()函数后的代码可以继续执行

循环守卫替代continue

import util.control.Breaks._

object Demo {

  var n = 1;

  while (true){

    n += 1

    if (n === 18){

      //在scala中使用函数式的break函数中断循环

      //def break(): Nothing = { throw breakException }

      //这样就导致后面的代码不会被执行,这时可以用breakable去处理

      break();

    }

  }

}


import util.control.Breaks._

object WhileBreak {

  def main(args: Array[String]): Unit = {

    var n = 1

    //breakable()函数

    //说明

    //1. breakable 是一个高阶函数:可以接收函数的函数就是高阶函数

    //2. def breakable(op: => Unit) {

    //    try {

    //      op

    //    } catch {

    //      case ex: BreakControl =>

    //        if (ex ne breakException) throw ex

    //    }

    //  }

    // (1) op: => Unit 表示接收的参数是一个没有输入,也没有返回值的函数

    // (2) 即可以简单理解可以接收一段代码块

    // 3. breakable 对break()抛出的异常做了处理,代码就继续执行

    // 4. 当我们传入的是代码块,scala程序员会将() 改成{}

    breakable {

      while (n <= 20) {

        n += 1

        println("n=" + n)

        if (n == 18) {

          // 使用函数式的break函数中断循环

          break()

        }

      }

    }

  }

}


使用循环守卫终端

 var loop = true

var sum2 = 0

for (i <- 1 to 100 if loop == true) {

    sum2 += i

    if (sum2 > 20) {

        println("循环守卫实现中断 第一次大于20的当前数=" + i)

        loop = false

      }

      println("i=" + i)

}


使用循环守卫控制步长

 for (i <- Range(1,10,2)){

      println(s"i=${i}")

 }

for (i <- 1 to 10 if i % 2 == 1) {

    println("i=" + i)

}


总结

    scala 的for循环形式和java是较大差异,这点请注意,但是基本的原理还是一样的。

1、Scala里面没有++  --的操作,如果非要实现类似的操作,那么使用的是 a -= 1操作

2、for循环的语法是 (for <- 表达式/集合/数组,常用的表达式 1 to 10 或 1 until 10  )

3、for循环支持多重for循环,可以写if条件表达式,并且表达式之前没有分号

4、for循环有返回值或者返回来一个新的集合在循环体前使用关键字yield

5、for循环中断用breakable高阶函数


欢迎关注全栈开发私房菜,每天进步一点点

长按二维码关注【全栈开发私房菜】



浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报