Scala 的流程控制语句

一、分支控制

1. if 分支

scala 复制代码
object TestIf {
    /*
      if (condition) { statement }
     */
    def main(args:Array[String]): Unit = {
        println("请输入您的成绩")
        val score: Int = StdIn.readInt()
        
        if (score >= 60) {
            println("及格")
        }
    }
}

2. if-else 分支

scala 复制代码
object TestIfElse {
    /*
          if (condition) { 
            statement1 
          } else { 
            statement2 
          }
     */
    def main(args:Array[String]): Unit = {
        println("请输入您的成绩")
        val score: Int = StdIn.readInt()
        
        if (score >= 60) {
            println("及格")
        } else {
            println("不及格")
        }
    }
}

3. if-else if-else 分支

scala 复制代码
object TestIfElseIf {
    /*
          if (condition) { 
            statement1 
          } else if { 
            statement2 
          } ...
          else {
          	statement3
          }
     */
    def main(args:Array[String]): Unit = {
        println("请输入您的成绩")
        val score: Int = StdIn.readInt()
        
        if (score >= 60) {
            println("及格")
        } else if (score >= 80) {
            println("良好")
        } else if (score >= 90) {
            println("优秀")
        } else {
            println("不及格")
        }
    }
}

4. if/if-else/if-elseif 分支返回值

scala 复制代码
// 分支返回值可以实现类似 Java 的三元运算符 a?b:c
object TestIfResult {
    def main(args:Array[String]): Unit = {
        println("请输入您的成绩")
        val score: Int = StdIn.readInt()
        
        val result: Unit = if (score >= 60) {
            println("及格")
        } else if (score >= 80) {
            println("良好")
        } else if (score >= 90) {
            println("优秀")
        } else {
            println("不及格")
        }
        println("result:" + result)
        
        val result2: String = if (score >= 60) {
            println("及格")
            "及格"
        } else if (score >= 80) {
            println("良好")
            "良好"
        } else if (score >= 90) {
            println("优秀")
            "优秀"
        } else {
            println("不及格")
            "不及格"
        }
        println("result2:" + result2)
        
        val result22: Unit = if (score >= 60) {
            println("及格")
            "及格"
        } else if (score >= 80) {
            println("良好")
            "良好"
        } else if (score >= 90) {
            println("优秀")
            "优秀"
        } else {
            println("不及格")
            "不及格"
        }
        println("result22:" + result22)
        
        val result3: Any = if (score >= 60) {
            println("及格")
            "及格"
        } else if (score >= 80) {
            println("良好")
            "良好"
        } else if (score >= 90) {
            println("优秀")
            score
        } else {
            println("不及格")
            score
        }
        println("result3:" + result3)
        
    }
}

二、循环控制

1. for循环

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

1.1 范围数据循环
  • to

    scala 复制代码
    object TestForTo {
        def main(args: Array[String]): Unit = {
            // java for循环: for(int i=0; i < 10; i++) {...}
            for(i <- 1 to 10) { // 包含边界
                println(i + ".helloWorld")
            }
            
            // 等价于
            for(i <- 1.to(10)) { // to 方法返回一个 Range.Inclusive 对象,元素为 1~10
                println(i + ".helloWorld")
            }
        }
    }
  • until

    scala 复制代码
    object TestForTo {
        def main(args: Array[String]): Unit = {
            for(i <- 1 until 10) { // 不包含边界
                println(i + ".helloWorld")
            }
            
            // 等价于
            for(i <- Range(1, 10)) { 
                println(i + ".helloWorld")
            }
        }
    }
1.2 循环守卫

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

scala 复制代码
object TestFor {
    /*
        java continue语法
        for(int i=0; i < 10; i++) {
        	if(i==5) {
        		continue;
        	} else {
        		...
        	}
        }
     */
    def main(args: Array[String]): Unit = {
        // 循环守卫
        for(i <- 1 to 10 if i != 5) {
            println(i)
        }
        
        // 等价于
        for(i <- 1 to 10) {
            if(i != 5) {
                println(i)
            }
        }
        
    }
}
1.3 循环步长
scala 复制代码
object TestFor {
    def main(args: Array[String]): Unit = {
        // 循环步长,step 不能为 0 
        for(i <- 1 to 10 by 2) {
            println(i) // 1 3 5 7 9
        }
        
        // 等价于
        for(i <- (1 to 10).by(2)) { // Range.by() 方法
            println(i) // 1 3 5 7 9
        }
        
        for(i <- 1.0 to 10.0 by 0.5) {
            println(i)
        }
        
        for(i <- 10 to 1 by -1) {
            println(i)
        }
        
    }
}
1.4 循环嵌套
scala 复制代码
object TestFor {
    def main(args: Array[String]): Unit = {
        for(i <- 1 to 3; j <- 1 to 3) {
            println("i = " + i + ", j = " + j)
        }
        
        // 等价于
        for(i <- 1 to 3) {
            for(j <- 1 to 3) {
                println("i = " + i + ", j = " + j)
            }
        }
        
        // 九九乘法表
        for(i <- 1 to 9; j <- 1 to i) {
            print(s"$j * $i = ${i * j}\t")
            if(j==i) println()
        }
    }
}
1.5 循环引入变量
scala 复制代码
object TestFor {
    def main(args: Array[String]): Unit = {
        for(i <- 1 to 10; j = 10 - i) {
            println(s"i = $i, j = $j")
        }
        
        // 等价于
        for {
            i <- 1 to 10
            j = 10 - i
        } {
            println(s"i = $i, j = $j")
        }
        
        // 等价于
        for (i <- 1 to 10) {
            val j = 10 - i
            println(s"i = $i, j = $j")
        }
        
    }
}
1.6 循环返回值
scala 复制代码
object TestFor {
    def main(args: Array[String]): Unit = {
        // 默认的 for 循环返回值为 Unit
        val res1: Unit = for(i <- 1 to 10) {
            // println(i)
            // "hello"
            // i
        }
        
        // yield 关键字将遍历过程中处理的结果返回到一个新 Vector 集合
        val res2: immutable.IndexedSeq[Int] = for(i <- 1 to 10) yield i
        println(res2) // Vector(1,2,3,4,5,6,7,8,9,10)
        
        
        val res3: immutable.IndexedSeq[Int] = for(i <- 1 to 10) yield {
            i * 2
        }
        println(res3) // Vector(2,4,6,8,10,12,14,16,18,20)
        
    }
}
1.7 循环倒序
scala 复制代码
object TestFor {
    def main(args: Array[String]): Unit = {
        // 倒序循环
        for(i <- 1 to 10 reverse) {
            println(i) // 10 9 8 7 6 5 4 3 2 1
        }
        
        // 等价于
        for(i <- 10 to 1 by -1) { 
            println(i)
        }
        
    }
}
1.8 案例
  • 需求:打印输出 n 行的等腰三角形

    复制代码
       *
      ***
     *****
    *******
  • 实现:

    scala 复制代码
    object TestPractice {
        def main(args: Array[String]): Unit = {
            println("请输入打印的行数")
            val line: Int = StdIn.readInt()
            
            for(i <- 1 to line; j = 2 * i - 1; m = line - i) {
                println(" " * m + "*" * j)
            }
            
        }
    }

2. while/do-while 循环

不推荐使用

2.1 while 循环
scala 复制代码
object TestWhile {
    def main(args: Array[String]): Unit = {
        // 需要在循环外部定义判断变量
        var a: Int = 1
        while(i <= 10) {
            println("while loop:" + a)
            a += 1
        }
        
        // while 语句没有返回值,即整个 while 语句的结果是 Unit 类型
    }
}
2.2 do-while 循环
scala 复制代码
object TestDoWhile {
    def main(args: Array[String]): Unit = {
        // do-while 至少会执行一次
        var b: Int = 0
        do {
            println("do-while loop:" + b)
            b -= 1
        } while(b > 0)
        
    }
}

3. 循环中断

Scala 去掉了 break 和 continue 关键字

scala 复制代码
object TestBreak {
    def main(args: Array[String]): Unit = {
        // 使用抛出异常的方式实现 break 功能
        try {
            for(i <- 1 to 10) {
                if(i == 3) {
                    throw new RuntimeException
                }
                println(i)
            }
        } catch {
            case e: Exception =>  // 不作任何处理
        }
        
        println("循环外")
        println("===============================")
        
        // 使用 Breaks 类的 break 方式实现
        // 导包时使用 import scala.util.control.Breaks._ 调用方法时可以省略 Breaks
        Breaks.breakable( // 方法内部是 try-catch
            for(i <- 1 to 10) {
                if(i == 3) {
                    Breaks.break() // 方法内部是 throw 异常
                }
                println(i)
            }
        )
        
        println("循环外")
    }
}
相关推荐
8K超高清2 分钟前
中国8K摄像机:科技赋能文化传承新图景
大数据·人工智能·科技·物联网·智能硬件
xixixin_11 分钟前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript
Asthenia041218 分钟前
DDD是什么?用一个电商的例子来入门
后端
W_chuanqi27 分钟前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
anlogic28 分钟前
Java基础 4.3
java·开发语言
uhakadotcom35 分钟前
阿里云STS:安全、灵活的临时访问管理
后端·面试·github
非ban必选1 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
Asthenia04121 小时前
深入剖析Java中的LinkedHashMap:内部结构、源码与比较
后端
A旧城以西1 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
Liudef061 小时前
deepseek v3-0324实现SVG 编辑器
开发语言·javascript·编辑器·deepseek