Scala(四)之 流程控制
文章目錄
4. 流程控制
4.1 分支控制if-else
4.1.1 單分支
1)基本語法
if (條件表示式) {
執行程式碼塊
}
4.1.2 雙分支
1)基本語法
if (條件表示式) {
執行程式碼塊1
} else {
執行程式碼塊2
}
4.1.3 多分支
1)基本語法
if (條件表示式1) {
執行程式碼塊1
}
else if (條件表示式2) {
執行程式碼塊2
}
……
else {
執行程式碼塊n
}
注意:
1.Scala中if else表示式其實是有返回值的,具體返回值取決於滿足條件的程式碼體的最後一行內容。
2.Scala中返回值型別不一致,取它們共同的祖先型別。
3.如果大括號{}內的邏輯程式碼只有一行,大括號可以省略。如果省略大括號,if只對最近的一行邏輯程式碼起作用。
4.2 巢狀分支
在一個分支結構中又完整的巢狀了另一個完整的分支結構,裡面的分支的結構稱為內層。分支外面的分支結構稱為外層分支。巢狀分支不要超過3層。
1)基本語法
if(){
if(){
}else{
}
}
2)案例實操
需求:如果輸入的年齡小於18,返回“童年”。如果輸入的年齡大於等於18,需要再判斷:如果年齡大於等於18且小於30,返回“中年”;如果其他,返回“老年”。
object TestIfElse {
def main(args: Array[String]): Unit = {
println("input age")
var age = StdIn.readInt()
val res :String = if (age < 18){
"童年"
}else {
if(age>=18 && age<30){
"中年"
}else{
"老年"
}
}
println(res)
}
}
4.3 Switch分支結構
在Scala中沒有Switch,而是使用模式匹配來處理。
4.4 For迴圈控制
Scala也為for迴圈這一常見的控制結構提供了非常多的特性,這些for迴圈的特性被稱為for推導式或for表示式。
4.4.1 範圍資料迴圈(To)
1)基本語法
for(i <- 1 to 3){
print(i + " ")
}
println()
(1)i 表示迴圈的變數,<- 規定to
(2)i 將會從 1-3 迴圈,前後閉合
4.4.2 範圍資料迴圈(Until)
1)基本語法
for(i <- 1 until 3) {
print(i + " ")
}
println()
(1)這種方式和前面的區別在於i是從1到3-1
(2)即使前閉合後開的範圍
4.4.3 迴圈守衛
1)基本語法
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
println()
(1)迴圈守衛,即迴圈保護式(也稱條件判斷式,守衛)。保護式為true則進入迴圈體內部,為false則跳過,類似於continue。
(2)上面的程式碼等價
for (i <- 1 to 3){
if (i != 2) {
print(i + " ")
}
}
4.4.4 迴圈步長
1)基本語法
for (i <- 1 to 10 by 2) {
println("i=" + i)
}
結果
i=1
i=3
i=5
i=7
i=9
說明:by表示步長
4.4.5 巢狀迴圈
1)基本語法
for(i <- 1 to 3; j <- 1 to 3) {
println(" i =" + i + " j = " + j)
}
說明:沒有關鍵字,所以範圍後一定要加;來隔斷邏輯
2)基本語法
上面的程式碼等價
for (i <- 1 to 3) {
for (j <- 1 to 3) {
println("i =" + i + " j=" + j)
}
}
4.4.6 引入變數
1)基本語法
for(i <- 1 to 3; j = 4 - i) {
println("i=" + i + " j=" + j)
}
說明:
(1)for推導式一行中有多個表示式時,所以要加 ; 來隔斷邏輯
(2)for推導式有一個不成文的約定:當for推導式僅包含單一表示式時使用圓括號,當包含多個表示式時,一般每行一個表示式,並用花括號代替圓括號,如下
for {
i <- 1 to 3
j = 4 - i
} {
println("i=" + i + " j=" + j)
練習
object Test1026 {
def main(args: Array[String]): Unit = {
for(i<- 1 to 18 by 2; j=(18-i)/2){
println(" "*j+"*"*i)
}
}
}
*
***
*****
*******
*********
***********
*************
***************
*****************
4.4.7 迴圈返回值
1)基本語法
val res = for(i <- 1 to 10) yield i
println(res)
說明:將遍歷過程中處理的結果返回到一個新Vector集合中,使用yield關鍵字。
注意:開發中很少使用。
2)案例實操
需求:將原資料中所有值乘以2,並把資料返回到一個新的集合中。
object TestFor {
def main(args: Array[String]): Unit = {
var res = for(i <-1 to 10) yield {
i * 2
}
println(res)
}
}
4.4.8 倒序列印
1)說明:如果想倒序列印一組資料,可以用reverse。
2)案例實操:
需求:倒序列印10到1
for(i <- 1 to 10 reverse){
println(i)
}
或者將步長設為-
for(i <- 10 to 1 by -1){
println(i)
}
4.5 While和do…While迴圈控制
While和do…While的使用和Java語言中用法相同。
4.5.1 While迴圈控制
1)基本語法
迴圈變數初始化
while (迴圈條件) {
迴圈體(語句)
迴圈變數迭代
}
說明:
(1)迴圈條件是返回一個布林值的表示式
(2)while迴圈是先判斷再執行語句
(3)與for語句不同,while語句沒有返回值,即整個while語句的結果是Unit型別()
(4)因為while中沒有返回值,所以當要用該語句來計算並返回結果時,就不可避免的使用變數,而變數需要宣告在while迴圈的外部,那麼就等同於迴圈的內部對外部的變數造成了影響,所以不推薦使用,而是推薦使用for迴圈。
2)案例實操
需求:輸出10句 “zmzdmx”
object TestWhile {
def main(args: Array[String]): Unit = {
var i = 0
while (i < 10) {
println("zmzdmx" + i)
i += 1
}
}
}
4.5.2 do…while迴圈控制
1)基本語法
迴圈變數初始化;
do{
迴圈體(語句)
迴圈變數迭代
} while(迴圈條件)
說明
(1)迴圈條件是返回一個布林值的表示式
(2)do…while迴圈是先執行,再判斷
2)案例實操
需求:輸出10句 “zmzdmx”
object TestWhile {
def main(args: Array[String]): Unit = {
var i = 0
do {
println("zmzdmx" + i)
i += 1
} while (i < 10)
}
}
4.6 迴圈中斷
1)基本說明
Scala內建控制結構特地去掉了break和continue,是為了更好的適應函數語言程式設計,推薦使用函式式的風格解決break和continue的功能,而不是一個關鍵字。Scala中使用breakable控制結構來實現break和continue功能。
2)案例實操
需求1:採用異常的方式退出迴圈
def main(args: Array[String]): Unit = {
try {
for (elem <- 1 to 10) {
println(elem)
if (elem == 5) throw new RuntimeException
}
}catch {
case e =>
}
println("正常結束迴圈")
}
需求2:採用Scala自帶的函式,退出迴圈
import scala.util.control.Breaks
def main(args: Array[String]): Unit = {
Breaks.breakable(
for (elem <- 1 to 10) {
println(elem)
if (elem == 5) Breaks.break()
}
)
println("正常結束迴圈")
}
需求3:對break進行省略
import scala.util.control.Breaks._
object TestBreak {
def main(args: Array[String]): Unit = {
breakable {
for (elem <- 1 to 10) {
println(elem)
if (elem == 5) break
}
}
println("正常結束迴圈")
}
}
需求4:迴圈遍歷10以內的所有資料,奇數列印,偶數跳過(continue)
object TestBreak {
def main(args: Array[String]): Unit = {
for (elem <- 1 to 10) {
if (elem % 2 == 1) {
println(elem)
} else {
println("continue")
}
}
}
}
4.7 多重迴圈
1)基本說明
(1)將一個迴圈放在另一個迴圈體內,就形成了巢狀迴圈。其中,for,while,do…while均可以作為外層迴圈和內層迴圈。【建議一般使用兩層,最多不要超過3層】
(2)設外層迴圈次數為m次,內層為n次,則內層迴圈體實際上需要執行m*n次。
2)案例實操
需求:列印出九九乘法表
object TestWhile {
def main(args: Array[String]): Unit = {
for (i <- 1 to 9) {
for (j <- 1 to i) {
print(j + "*" + i + "=" + (i * j) + "\t")
}
println()
}
}
}
相關文章
- Scala(一):函式、流程控制、引數函式
- Scala(四):物件物件
- 重溫手冊(四):流程控制
- 【Scala】Scala之ObjectObject
- 第四章 控制執行流程
- 【Scala】Scala之TraitsAI
- 【Scala】Scala之Packaging and ImportsImport
- Scala 中的集合(四):CanBuildFromUI
- Scala學習(四)練習
- Scala與Java差異(二)之條件控制與迴圈Java
- scala學習筆記:控制抽象筆記抽象
- 從 Java 到 Scala(四):TraitsJavaAI
- scala入門之編寫scala指令碼指令碼
- 自定義控制元件(四) 原始碼分析 layout 和 draw 流程控制元件原始碼
- Java雜記3—流程控制之條件Java
- 12.python流程控制之if判斷Python
- go 流程控制之switch 語句介紹Go
- Java控制流程Java
- 流程控制
- 【Scala之旅】控制結構和註解
- [譯] Scala 型別的型別(四)型別
- Web專案經理手冊之版本控制流程Web
- 入門篇-其之十-流程控制之迴圈結構
- tkinter學習系列(四)之Button 控制元件控制元件
- PHP流程控制PHP
- Practice| 流程控制
- Bash流程控制
- 五、流程控制
- Java流程控制Java
- Javascript 流程控制JavaScript
- Rust 流程控制Rust
- 12、流程控制
- 流程控制语句
- shell流程控制
- Scala學習(四)---對映和元組
- Python基礎之:Python中的流程控制Python
- Go語言流程控制之迴圈結構篇Go
- Spark連線MongoDB之ScalaSparkMongoDB