循环

注意:scala没有++这个操作符

  1. scala> val s = "hello123";
  2. s: String = hello123
  3. scala> for (c <- s) println(c)

for里面的就是把s遍历出来的元素赋值给c

<- 规定 to, 前后闭合

表达式1-10循环

  1. for (i <- 1 to 10)
  2. println(i)

循环数组

  1. # val arr = Array[String](_"a"_ "b"_ "c")
  2. val arr = Array("a", "b", "c")
  3. for (i <- arr)
  4. println(i)

高级循环,带if

每个生成器都可以带一个条件,注意: if前面没有分号

  1. for (i <- 1 to 3 if i != 2) {
  2. println(i + " ")
  3. }
  4. // 类似
  5. for (i <- 1 to 3) {
  6. if (i != 2) {
  7. println(i + " ")
  8. }
  9. }

循环步长

by表示步长

  1. for (i <- 1 to 10 by 2) {
  2. println(i + " ")
  3. }

嵌套循环

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

  1. for (i <- 1 to 3; j <- 1 to 3) {
  2. println("i = " + i + " j = " + j)
  3. }
  4. //类似
  5. for (i <- 1 to 3) {
  6. for (j <- 1 to 3) {
  7. println("i = " + i + " j = " + j)
  8. }
  9. }

引入变量

  1. for (i <- 1 to 3; j = 4 -i) {
  2. println("i = " + i + " j = " + j)
  3. }
  4. 输出
  5. i = 1 j = 3
  6. i = 2 j = 2
  7. i = 3 j = 1
  1. for 推导式一行中有多个表达式时,所以要加 ;来隔断逻辑
  2. for 推导式有一个不成文的约定:当 for 推导式仅包含单一表达式时使用圆括号, 当包含多个表达式时,一般每行一个表达式,并用花括号代替圆括号,如下 ```scala for { i <- 1 to 3 j = 4 -i } { println(“i = “ + i + “ j = “ + j) }

等价于

for (i <- 1 to 3) { var j = 4 -i println(“i = “ + i + “ j = “ + j) }

  1. <a name="CWt6P"></a>
  2. ## 倒叙打印
  3. 如果想倒序打印一组数据,可以用 reverse
  4. ```scala
  5. for (i <- 1 to 3 reverse) {
  6. println("i = " + i)
  7. }

for推导式, yield


如果for循环的循环体以yield开始,则该循环会构建出一个集合
每次迭代生成集合中的一个值
将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。

在Scala中for循环是和yield一起使用的,他的形式是for (enumerators) yield e。 此处 enumerators 指一组以分号分隔的枚举器。这里的enumerator 要么是一个产生新变量的生成器,要么是一个过滤器。for 表达式在枚举器产生的每一次绑定中都会计算 e 值,并在循环结束后返回这些值组成的序列

  1. val v = for (i <- 1 to 10) yield i * 10
  2. println(v)
  3. Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

util包左不包右

  1. val a = Array("a", "b", "c")
  2. for(i <- 0 util a.length) println(a(i))
  1. //这种方式和前面的区别在于 i 是从 1 到 3-1
  2. for (i <- 1 until 3) {
  3. println(i + " ")
  4. }

while循环中断

Scala 内置控制结构特地去掉了break和continue,是为了更好的适应函数式编程,推 荐使用函数式的风格解决 break 和 continue 的功能,而不是一个关键字。Scala 中使用 breakable 控制结构来实现 break 和 continue 功能。

  1. import scala.util.control.Breaks
  2. val loop = new Breaks
  3. var n = 1
  4. loop.breakable{
  5. while(n<=20) {
  6. n+=1;
  7. println(n)
  8. if(n == 18) {
  9. loop.break()
  10. }
  11. }
  12. }

for循环中断

  1. import scala.util.control.Breaks
  2. Breaks.breakable(
  3. for (i <- 1 to 10) {
  4. println("i = " + i)
  5. if (i == 5) Breaks.break()
  6. }
  7. )

对break进行省略

  1. import scala.util.control.Breaks._
  2. breakable(
  3. for (i <- 1 to 10) {
  4. println("i = " + i)
  5. if (i == 5) break()
  6. }
  7. )

continue

  1. for(i<-0 until 10){
  2. breakable{
  3. if(i==3||i==6) {
  4. break
  5. }
  6. println(i)
  7. }
  8. }
  9. //0,1,2,3,5,7,8,9


多重while循环

  1. import scala.util.control.Breaks
  2. val loop1 = new Breaks
  3. val loop2 = new Breaks
  4. var count = 1
  5. loop1.breakable {
  6. while (true) {
  7. count += 1
  8. println(count)
  9. if (count == 10) {
  10. loop1.break()
  11. }
  12. loop2.breakable {
  13. while (true) {
  14. println(count)
  15. count += 1
  16. if (count == 20) {
  17. loop2.break()
  18. }
  19. }
  20. }
  21. }
  22. }

迭代修改值

  1. val list = List((1, "a"), (2, "a"), (3, "c"))
  2. val list2 = list.map { case (a, b) => (a + 1, b + "zy") }
  3. println(list2)