Scala 新手實戰三案例:從循環到條件,搞定基礎編程場景
對 Scala 新手來說,單純記語法容易 “學完就忘”,而通過小而精的實戰案例鞏固知識點,是掌握語言的關鍵。本文精選三個高頻基礎場景 ——9 乘 9 乘法口訣表、成績等級評定、整數約數查找,每個案例都覆蓋 Scala 核心語法(循環、條件、集合、輸入輸出),并附帶代碼解析和運行驗證,幫你真正理解 “代碼為什么這么寫”。
一、案例一:9 乘 9 乘法口訣表(掌握嵌套循環與字符串格式化)
1.1 需求分析
輸出標準乘法口訣表:
-
共 9 行,第
i
行包含i
個乘法表達式(如第 3 行:1×3=3、2×3=6、3×3=9) -
表達式對齊,格式整潔(避免因數字位數導致錯位)
1.2 完整代碼(含注釋)
object MultiplicationTable {?def main(args: Array[String]): Unit = {?// 外層循環:控制行數(i從1到9,閉區間用to)?for (i <- 1 to 9) {?// 內層循環:控制每行的列數(j從1到i,確保第i行有i個表達式)?for (j <- 1 to i) {?// 字符串插值(s"")+ 制表符(\t):既簡化拼接,又保證對齊?print(s"$j×$i=${j * i}\t")?}?// 每行結束后換行?println()?}?}?
}
1.3 核心知識點拆解(新手必懂)
- Scala 的 for 循環特性:
-
1 to 9
生成閉區間(包含 1 和 9),若用1 until 9
則是左閉右開(包含 1,不包含 9),這里需用to
才夠 9 行。 -
嵌套循環邏輯:外層
i
控制 “被乘數”(如第 3 行所有表達式的第二個數都是 3),內層j
控制 “乘數”(從 1 遞增到i
)。
-
字符串插值(s""):
相比 Java 的
"$j×$i=" + (j*i)
,Scala 的s""
可直接在字符串中嵌入變量($變量名
)或表達式(${表達式}
),代碼更簡潔,且不易出錯。 -
制表符(\t)的作用:
每個表達式后加
\t
,會讓輸出按 “制表位” 對齊(無論j*i
是 1 位還是 2 位,都能保持列對齊),最終輸出格式整齊。
1.4 運行結果(IDEA 中直接右鍵運行)
二、案例二:成績等級評定(掌握條件表達式嵌套與返回值特性)
2.1 需求分析
根據輸入的整數成績(0-100 分)評定等級:
-
90 分及以上 → A(優秀)
-
60-89 分 → B(及格)
-
60 分以下 → C(不及格)
-
需處理邊界值(如 60 分、90 分),且代碼邏輯清晰。
2.2 兩種實現方案(對比學習)
Scala 的條件表達式是 “有返回值的”,因此有兩種常見寫法,可根據場景選擇:
方案 1:嵌套 if-else(適合復雜多層判斷)
object GradeEvaluator {?def main(args: Array[String]): Unit = {?// 測試多個分數(用List存儲,便于批量驗證)?val scores = List(95, 80, 60, 55, 100, 0)??// 遍歷分數,調用評級函數并打印結果?scores.foreach(score => {?val grade = getGradeByNested(score)?println(s"分數 $score → 等級 $grade")?})?}?
?// 嵌套if-else實現:先判斷是否及格,再判斷是否優秀?def getGradeByNested(score: Int): Char = {?if (score >= 60) { // 第一層:是否及格?if (score >= 90) 'A' // 第二層:及格中是否優秀?else 'B' // 及格但不優秀?} else {?'C' // 不及格?}?}?
}
方案 2:else if(適合扁平多層判斷)
若判斷條件是 “互斥且有序” 的,用else if
更簡潔,邏輯更直觀:
// 新增else if實現的函數(替換上述getGradeByNested即可)?
def getGradeByElseIf(score: Int): Char = {?if (score >= 90) 'A' // 優先級1:先判斷最高等級?else if (score >= 60) 'B' // 優先級2:再判斷及格?else 'C' // 優先級3:最后判斷不及格?
}
2.3 核心知識點拆解
-
Scala 條件表達式的 “返回值特性”:
Java 中
if-else
是 “語句”(無返回值,需用return
手動返回),而 Scala 中if-else
是 “表達式”(每個分支的結果就是返回值,無需return
)。例:
val grade = if (score >=90) 'A' else 'B'
完全合法,grade
會直接接收分支結果。 -
兩種判斷邏輯的選擇場景:
-
嵌套
if-else
:適合 “先過濾大類,再細分小類” 的場景(如先判斷 “是否成年”,再判斷 “是否滿 30 歲”)。 -
else if
:適合 “按優先級排序” 的判斷(如成績等級從高到低判斷),代碼更扁平,可讀性更高。
-
List 遍歷與 foreach:
用
scores.foreach(...)
替代for (score <- scores)
,是 Scala 函數式編程的初步體現(將 “遍歷” 邏輯封裝為方法),代碼更簡潔。
2.4 運行結果
兩種方案輸出一致,邊界值處理正確:
分數 95 → 等級 A分數 80 → 等級 B分數 60 → 等級 B分數 55 → 等級 C分數 100 → 等級 A分數 0 → 等級 C
三、案例三:整數約數查找(掌握輸入輸出、特殊處理與集合篩選)
3.1 需求分析
-
接收用戶輸入的整數(支持正、負、0)
-
找出該整數的所有約數,存儲到數組中
-
打印數組(格式友好,如
[1, 2, 3, 6]
) -
特殊處理:0 有無限個約數,需提示用戶。
3.2 完整代碼(含異常場景處理)
object DivisorFinder {?def main(args: Array[String]): Unit = {?def findDivisors(n: Int): Array[Int] = {?// 特殊處理1:0有無限個約數,返回空數組并提示?if (n == 0) {?println("?? 注意:0有無限個約數,無法全部列出")?return Array.empty[Int] // 返回空數組?}?
?// 特殊處理2:負數的約數與絕對值的約數相同,先取絕對值?val absNum = math.abs(n)?
?// 篩選約數:從1到absNum,過濾出能整除absNum的數?// (1 to absNum):生成整數序列;filter:篩選符合條件的元素;toArray:轉為數組?(1 to absNum).filter(i => absNum % i == 0).toArray?}?
}
3.3 核心知識點拆解
-
Scala 標準輸入(StdIn):
用
scala.io``.StdIn.readInt()
直接讀取整數輸入,無需像 Java 那樣創建Scanner
對象,代碼更簡潔。若需讀取字符串,可用readLine()
。 -
特殊場景處理:
-
0 的約數:數學上 0 能被任意非零整數整除,因此約數無限,程序主動提示并返回空數組,避免邏輯錯誤。
-
負數的約數:約數是 “整除” 的概念,與正負無關(如 - 12 的約數和 12 的約數相同),用
math.abs(n)
取絕對值,統一處理邏輯。
- 集合篩選(filter)與類型轉換:
-
(1 to absNum)
生成 “整數序列”(Range 類型),不是數組。 -
filter(i => absNum % i == 0)
:遍歷序列,保留 “能整除 absNum” 的元素(i 是約數的條件)。 -
toArray
:將篩選后的序列轉為數組,滿足 “存儲到數組” 的需求。
-
數組格式化打印(mkString):
數組默認打印格式是
[I@6d06d69c
(內存地址),用mkString(prefix, separator, suffix)
可自定義格式:
-
prefix
:開頭字符(如[
) -
separator
:元素間分隔符(如,
) -
suffix
:結尾字符(如]
)
3.4 運行結果(多場景測試)
場景 1:輸入正數(如 12)
請輸入一個整數:12整數 12 的所有約數:\[1, 2, 3, 4, 6, 12]
場景 2:輸入負數(如 - 18)
請輸入一個整數:-18整數 -18 的所有約數:\[1, 2, 3, 6, 9, 18]
場景 3:輸入 0
請輸入一個整數:0?? 注意:0有無限個約數,無法全部列出整數 0 的所有約數:\[]
四、三個案例的共性 Scala 特性總結
通過三個案例,你能發現 Scala 的核心設計思想,這些特性會貫穿后續所有編程場景:
特性 | 案例體現 | 優勢 |
---|---|---|
表達式導向 | 條件表達式返回值、for 循環生成序列 | 無需return ,代碼簡潔,減少冗余 |
函數式編程初步 | List.foreach 、Range.filter | 封裝遍歷 / 篩選邏輯,代碼更易讀 |
簡潔的 API 設計 | StdIn.readInt() 、mkString 、math.abs | 避免重復造輪子,開發效率高 |
類型轉換便捷 | toArray 、to /until 生成序列 | 集合間轉換靈活,滿足不同場景需求 |
異常場景友好處理 | 0 的約數提示、負數絕對值處理 | 程序魯棒性強,減少崩潰風險 |
五、新手進階建議:基于案例擴展練習
學會 “修改代碼” 比 “看懂代碼” 更重要,推薦幾個擴展方向,幫你深化理解:
-
乘法表擴展:
輸出 “倒序乘法表”(從 9 行到 1 行),只需將外層循環改為
for (i <- 9 to 1 by -1)
(by -1
表示步長為 - 1,反向遍歷)。 -
成績等級擴展:
增加 D 級(40-59 分)和 E 級(40 分以下),用
else if
補充判斷邏輯,測試邊界值(如 40 分、59 分)。 -
約數擴展:
給約數數組去重(如輸入 16,約數是 [1,2,4,8,16],無重復,可模擬輸入重復場景)、按降序排序(在
toArray
后加.sorted(Ordering[Int].reverse)
)。
結語
Scala 的學習核心是 “先實戰,再歸納”。這三個案例覆蓋了新手最常用的語法場景,建議你在 IDEA 中逐行敲寫代碼,嘗試修改邏輯(如改循環條件、加判斷分支),觀察輸出變化 —— 只有動手實踐,才能真正掌握 Scala 的靈活與高效。后續可深入學習 Scala 的集合框架(List、Map)和函數式編程(匿名函數、高階函數),逐步解鎖更多高級特性!