Scala系列|流程控制语句

Posted 浮世Talk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala系列|流程控制语句相关的知识,希望对你有一定的参考价值。

听一首好音乐才是正经事。


This browser does not support music or audio playback. Please play it in WeChat or another browser.

几乎所有的编程语言中,都是由流程控制语言决定着程序如何运行, Scala语言中控制结构和Java语言中的控制结构基本相同,主要有三大流程控制语句:顺序控制、分支控制、循环控制。

顺序控制

顺序控制程序是指由上至下逐行地执行,中间没有任何判断和跳转。顺序控制流程使用中要注意的一点是定义变量时采用合法的前向引用,即程序中不能使用未声明的变量。

 def main(args: Array[String]): Unit = {
    val a = 9
    val b = a + 5

    // val num2 = num1 + 3 //这里会报错
    // val num1 = 7
 }

分支控制

分支控制流程的作用是让程序有选择的执行相应的代码块,在Scala中主要是用if-else控制分支流程,有过编程基础的朋友们肯定知道switch语句也可以实现分支控制,但是Scala中没用switch,而是引入了功能更为强大的模式匹配,这里只对if-else做介绍。if-else分支也可以分单分支、双分支、多分支、嵌套分支,下面我们逐一了解。

单分支

单分支简单地说就是满足条件就执行对应功能代码,否则就跳过,不执行任何代码。

  def main(args: Array[String]): Unit = {
    println("请输入年龄:")
    val age = StdIn.readInt()
    if (age >= 16) {
      println("可以玩游戏啦")
    }
  }

双分支

双分支简单地说就是满足条件就执行对应功能代码,否则就执行else里面的代码:

def main(args: Array[String]): Unit = {
    println("请输入年龄:")
    val age = StdIn.readInt()
    if (age >= 16) {
      println("可以玩游戏啦")
    } else {
      println("小孩子去做作业")
    }
  }

多分支

多分支流程指的是程序有多个判断语句,当条件1成立,就执行条件1相应的功能代码块,当条件2成立,就执行条件2对应的代码块,以此类推。当所有条件都不成立,则执行else里面的代码块。

def main(args: Array[String]): Unit = {
    print("请输入分数:")
    val grade = StdIn.readInt()
    if (grade >= 90) {
      println("优秀")
    } else if (grade >= 80 && grade < 90) {
      println("良好")
    } else if (grade >= 70 && grade < 80) {
      println("良好")
    } else if (grade >= 60 && grade < 70) {
      println("一般")
    } else {
      println("补考")
    }
  }

嵌套分支

嵌套分支指的是在一个完整的分支结构中,还嵌套着一个完整的分支结构,外面的分支称为外层分支,里面的分支称为内层分支。为了代码的可读性,嵌套分支不宜多于3层。

def main(args: Array[String]): Unit = {
    print("请输入季节(旺季or淡季):")
    val season = StdIn.readLine()
    print("请输入年龄:")
    val age = StdIn.readInt()
    if ("旺季" == season) {
      if (age < 16) {
        println("旺季孩子收费40¥")
      } else {
        println("旺季大人收费50¥")
      }
    } else {
      if (age < 16) {
        println("淡季孩子收费20¥")
      } else {
        println("淡季大人收费30¥")
      }
    }
 }

循环控制

有时我们需要多次执行同一语句或者代码块,例如输出10次hello world,这时循环控制就是个很好的选择。Scala提供了三种循环类型的循环控制,for循环、while循环、do while循环。

for循环

for循环是最常用的一种循环模式,Scala为for循环提供了非常多的特性,这些for循环称为for推导式或者for表达式。

def main(args: Array[String]): Unit = {
    //   i 表示循环的变量, <- 表示赋值给 i
    //   1 to 10表示从1到10循环,前闭后闭
    for (i <- 1 to 10) {
      println(i)
    }
    //   1 until 100表示从1到10循环,前闭后开
    for (i <- 1 until 10) {
      println(i)
    }
  }

此外,for循环里面还可以有判断语句和变量赋值语句。

def main(args: Array[String]): Unit = {
    //守卫
    for (i <- 1 to 10 if i % 2 == 0) {
      println(i)
    }
    //引入变量,需要分号
    for (i <- 1 to 10; j = i + 1) {
      println(i)
    }
  }

for循环也可以有返回值,通过yield关键字返回一个新的集合。

//通过yield关键字返回10以内的偶数组成的结合
  def main(args: Array[String]): Unit = {
    val arr = for (i <- 1 to 10 if i % 2 == 0yield i
    println(arr)
    //Vector(2, 4, 6, 8, 10)
  }

嵌套循环

多个for循环嵌套在一起使用,组成嵌套循环,以下是打印99乘法表的嵌套for循环。

def main(args: Array[String]): Unit = {
    println("第一种写法")
    for (i <- 1 to 9) {
      for (j <- 1 to i) {
        print(j + "*" + i + "=" + j * i + " ")
        if (j == i) println()
      }
    }
    println("第二种写法")
    for (i <- 1 to 9; j <- 1 to i) {
      print(j + "*" + i + "=" + j * i + " ")
      if (j == i) println()
    }
  }

while循环

while是Scala语言用作循环的关键词,它接收一个任意的表达式,当这个表达式返回值为非零时都视为true,为true则执行while里的代码语句或者代码块。

def main(args: Array[String]): Unit = {
    val age = 18
    while (age >= 16) {
      println("满足条件,玩游戏")
    }
  }

如上所示,while循环是无限循环,程序一旦运行起来会无限执行下去,要跳出循环需要引入跳出循环的标记。Scala语言去掉了break和continue,是为了更好的适应函数化编程,推荐使用函数式的风格解决break和contine的功能,而不是一个关键字。

def main(args: Array[String]): Unit = {
    val age = 18
    var count = 0
    //使用前需要引入包
    import util.control.Breaks._
    breakable {
      while (age >= 16) {
        println("满足条件,可以玩游戏")
        count += 1
        if (count == 10) {
          println("休息一下")
          break() //跳出循环
        }
      }
    }
  }

do while循环

do while循环是先执行一遍循环体,再做判断。

def main(args: Array[String]): Unit = {
    //使用前需要引入包
    import util.control.Breaks._
    var count = 0
    breakable {
      do {
        if (count == 12) {
          break()
        }
        count += 1
        println("先交房租")
      } while (true//是否续租
    }
  }

这三种循环中,while和do while的循环体在进行逻辑判断时都需要依赖外面定义的变量,这相当于在循环的内部改变了循环外部的变量,在实际的工作中不推荐, 而是推荐使用for循环。

- THE END -

扩展阅读:



题图:2019年7月13号 广东省博物馆《南海一号》

音乐:Guns N' RosesSweet Child O' Mine





以上是关于Scala系列|流程控制语句的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的流程控制

Scala 循环

Kotlin------流程控制语句

Go语言系列-03-流程控制语句

Scala核心编程_第04章 程序流程控制

Scala基础学习之for循环和while循环