scala的基本语法(二):流程控制

一、If-else

① 单分支

​ if(条件表达式) 没有else

② 双分支

​ 类似java 三元运算符 if(条件表达式) -----else----

③多分支

​ if (条件表达式) else if (条件表达式) else

二、 For循环

1.普通for

for(i <- 0 to n)

for (i<- 0 until n)

  • to 区间是开区间,until 左闭右开
  • for循环的变量i与其他同名变量i不冲突(同java),作用域持续到循环结束;该变量类型是集合的元素类型

2.高级for循环 循环控制

循环守卫

  • 即循环保护式(也称条件判断式,守卫)。保护式为true则进入循环体内部,为false则跳过,类似于continue

  • 每个生成器都可以带上守卫,以if开头的Boolean表达式,注意if前面没有分号

  • 变量<-表达式的形式可以提供多个生成器,之间用**;**隔开。

  • 可以使用任意多的定义 ,引入可以在循环中使用的变量:

    for(i<- 1 to 3;from=4-i;j<- from to 3)print(f"${10*i+j}%3d")//书上的例子
    for (i <- 1 to 9; y <- 1 to i) {print(f"$i%dX$y%d=$i * y%d+\t") ;if (i == y) println()} //99乘法表
    for (i <- 1 to 9; y <- 1 to i; n = i * y) if (i == y) println(i + "X" + y+"=" + n) else print(f"$i%dX$y%d=$n%d+\t")//99乘法表方式二
    

break

参考后面Break

步长控制Range、 By、indices、reverse

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

for(i<-1 to 10 by 2)

for(i<-1 to 10 reverse)

  • 此处的range区间为左开右闭
  • 循环守卫也可以实现步长控制

For推导式(For comprehension)

​ for循环中的 yield 后可以写代码块,yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scala中for循环是有返回值的。如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是List,以此类推。生成的集合与他的第一个生成器是类型兼容的。

scala> val arr = Array(1, 2, 3, 4, 5)
scala> for (e <- arr) yield e
res1: Array[Int] = Array(1, 2, 3, 4, 5)//数组
val res = for(i <- 1 to 10) yield i * 2//集合
println(res) 
Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

三 、While循环

① while

while (循环条件) {
        循环体(语句)
        循环变量迭代
	}

②do while

   do{
        循环体(语句)
        循环变量迭代
   } while(循环条件)

Break

​ 两种方法breakable(高阶函数),Breaks.break()

1.import util.control.Breaks
 直接使用Breaks.break()//虽然中止了,但会报异常
2.import util.control.Breaks._
  //使用 breakable函数 需要将完整代码包裹
   breakable {
          break() //不会报错
        }

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

注意的地方

  • Scala中任意表达式都是有返回值的,所以引入一个Unit类,写作(),表示无值的值。if 表达式不带else 等同于返回()——快学scala

  • 与If语句不同,While语句本身没有值,即整个While语句的结果是Unit类型的()

  • 因为while中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量 ,所以不推荐使用,推荐使用for循环

​ for 优化 ()

/ for(i <- 1 to 100 if flag) {
//        sum += i
//        if( sum > 20) {
//          curI = i
//          flag = false
//        }
posted @ 2019-12-01 12:04  曲水修竹  阅读(31)  评论(0编辑  收藏  举报