zoukankan      html  css  js  c++  java
  • Scala流程控制

    流程控制

    分支控制

    让程序有所选择的进行执行,分支控制有三种:单分支、双分支、多分支

    单分支

    if (条件表达式) {
        // 执行代码块
    }
    

    当条件表达式为true时,就会执行 {} 的代码

    双分支

    多分支

    package chapter04
    
    import scala.io.StdIn
    
    object Test01_IfElse {
      def main(args: Array[String]): Unit = {
        print("请输入您的年龄:")
        val age: Int = StdIn.readInt()
    
        // 单分支
        if (age > 18) {
          println("成年")
        }
    
        println("====================")
    
        // 双分支
        if (age >= 18) {
          println("成年")
        } else {
          println("未成年")
        }
    
        // 多分支
        if (age <= 6) {
          println("童年")
        } else if(age <= 18) {
          println("青少年")
        } else if(age < 40) {
          println("青年")
        } else {
          println("老年")
        }
    
      }
    }
    

    返回值*

    Scala中,分支表达式会有一个返回值。这个返回值,默认是执行的分支语句中的最后一句话。

    package chapter04
    
    import scala.io.StdIn
    
    object Test01_IfElse {
      def main(args: Array[String]): Unit = {
        // 返回值
        val sex: Char = '男'
        val result = if (sex == '男') {
          println('男')
        } else if(sex == '女') {
          println('女')
        } else {
          println("不可告人的秘密")
        }
    
        println(s"result: ${result}")
    
        var resultStr: String = if (sex == '男') {
          println('男')
          "男"
        } else if(sex == '女') {
          println('女')
          "女"
        } else {
          println("不可告人的秘密")
          "不可告人的秘密"
        }
    
        println(s"resultStr: ${resultStr}")
      }
    }
    

    嵌套分支

    if语句中可以嵌套if语句

    for循环控制

    Scala也为for循环这一常见的控制结构提供了非常多的特性,这些for循环的特性被称为for推导式或for表达式。

    范围数据循环To

    基本语法
    for(i < -1 to 3) {
        // 代码
    }
    

    范围数据循环Unitl

    循环守卫

    基本语法
    for(i <- 1 to 3 if i != 2) {
        // 代码
    }
    

    循环守卫,即循环保护式。保护式为true则进入循环内部;为false则跳过,类似于continue。

    所以,上面的代码等价于

    for (i <- 1 to 3) {
        if(i != 2) {
            // 代码
        }
    }
    

    循环步长

    嵌套循环

    基本语法
    for(i <- 1 to 3; j <- 1 to 3) {
        // 代码
    }
    

    此语法等价于:

    for(i <- 1 to 3) {
        for(j <- 1 to 3) {
            // 代码
        }
    }
    

    引入变量

    基本语法
    for(i <- 1 to 3; j = 4 - i) {
        // 代码
    }
    

    for推断式一行中有多个表达式时,所以要加;来阻断逻辑

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

    循环返回值

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

    基本语法
    val res = for(i <- 1 to 10) yield i
    println(res)
    

    开发中很少这样使用。

    倒序打印

    while循环控制

    while和do...while的使用和Java语言中用法相同

    while

    循环条件是返回一个布尔值的表达式

    while循环是先判断再执行语句

    与for语句不同,while语句没有返回值,即整个while语句结果是Unit类型。

    因为while中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免使用变量,而变量需要生命在while循环的外部,那么就等同于循环的内部对外部的变量造成了影响,所以不推荐使用。

    do...while

    package chapter04
    
    object Test05_WhileLoop {
      def main(args: Array[String]): Unit = {
        var a: Int = 10
        while (a >= 1) {
          println("This is a while loop:" + a)
          a -= 1
        }
    
        var b: Int = 0
        do {
          println("This is a do while loop:" + b)
          b += 1
        } while (b > 0)
      }
    }
    

    循环中断

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

    package chapter04
    
    import scala.util.control.Breaks
    
    object Test06_Break {
      def main(args: Array[String]): Unit = {
        // 采用抛出异常的方式,退出循环
        try {
          for (i <- 0 until 5) {
            if (i == 3) {
              throw new RuntimeException
            }
            println(i)
          }
        } catch {
          case e: RuntimeException => // 什么都不做,只是抛出异常,退出循环
        }
    
        println("循环结束")
    
        // 2. 使用Scala中Breaks类中的break方法,实现异常的抛出和捕捉
        Breaks.breakable(
          for (i <- 1 until 10) {
            if (i == 3)
              Breaks.break()
            println(i)
          }
        )
    
      }
    }
    
  • 相关阅读:
    MPI 学习
    关于谱聚类
    线程调度的学习例子
    [转] Linux的IO复用
    网络编程socket
    关于python机器学习常用算法的例子
    [转](阿里笔试)使用多线程和sleep函数生成字符串的伪随机排列
    Single Number II
    阿里面试题,N个士兵的通话问题
    凸优化算法之牛顿法
  • 原文地址:https://www.cnblogs.com/Gazikel/p/15760850.html
Copyright © 2011-2022 走看看