Scala 編程語言中文教學網站
Scala 是一種結合物件導向與函數式編程的現代語言,擁有靜態型別、安全的型別系統,以及與 JVM 生態系高度相容的優勢。這個教學網站以 Scala 3 為核心,從入門語法一路帶你走到集合操作、模式比對、非同步處理與實用範例。
🚀 Scala 是什麼 Why Scala
Scala 的設計目標之一,是用更精鍊、表達力更高的方式,來同時支援 OOP 與 FP。Scala 3 的語法與語言設計也經過重新整理,使其更清楚、更容易理解,非常適合想學習現代編程風格的開發者。
🧱 物件導向
支援類別、物件、繼承、特質(Traits),適合大型系統建模。
🧮 函數式編程
鼓勵不可變資料、純函式、高階函式與模式比對。
☕ JVM 生態整合
可直接使用 Java 函式庫,適合後端、資料處理、分散式系統。
如果你已經有 Java、Python、JavaScript、Kotlin 等語言基礎,Scala 會是一個很好的進階選擇。
🛠️ 開發環境
學習 Scala 最常見的方式有:
- 安裝
JDK - 使用
scala-cli執行單檔程式 - 使用
sbt管理專案 - 搭配 VS Code / IntelliJ IDEA
Scala 3@main def hello(): Unit =
println("Hello, Scala!")
@main 作為程式進入點,讓撰寫命令列程式更簡潔。
✍️ 基礎語法
輸出println("Scala 很適合寫資料處理與後端服務")
註解// 這是單行註解
/*
這是多行註解
*/
Scala 3 支援更現代的縮排寫法,某些情況下可以省略大括號,使程式看起來更乾淨。
if 範例val score = 88
if score >= 60 then
println("及格")
else
println("不及格")
📦 型別與變數
val 用於不可變值,var 用於可重新指定的新值。Scala 鼓勵優先使用 val,這有助於降低錯誤並更貼近函數式思維。
變數val name: String = "Scala"
var age: Int = 20
age = 21
println(s"$name 語言年齡示意:$age")
| 型別 | 說明 | 範例 |
|---|---|---|
Int |
整數 | 123 |
Double |
浮點數 | 3.14 |
Boolean |
布林值 | true / false |
String |
字串 | "Hello" |
Unit |
類似「沒有回傳值」 | 通常用在只做副作用的函式 |
推導val price = 99.9 // Scala 推導為 Double
val isOpen = true // Scala 推導為 Boolean
val title = "Scala" // Scala 推導為 String
🔀 流程控制
條件判斷val temperature = 30
val message =
if temperature >= 28 then "天氣偏熱"
else "天氣舒適"
println(message)
forfor i <- 1 to 5 do
println(s"第 $i 次執行")
whilevar count = 3
while count > 0 do
println(count)
count -= 1
matchval level = 2
val result = level match
case 1 => "初級"
case 2 => "中級"
case 3 => "高級"
case _ => "未知"
println(result)
🧠 函式與方法
函式def add(a: Int, b: Int): Int =
a + b
println(add(3, 5))
無參數def greet(): Unit =
println("歡迎來到 Scala 世界")
greet()
預設值def welcome(name: String = "學員"): String =
s"你好,$name"
println(welcome())
println(welcome("小明"))
高階函式可以接收函式作為參數,或回傳函式。
高階函式def operate(x: Int, y: Int, fn: (Int, Int) => Int): Int =
fn(x, y)
val sum = operate(10, 20, (a, b) => a + b)
val max = operate(10, 20, (a, b) => if a > b then a else b)
println(sum)
println(max)
🧺 集合操作
Scala 的集合 API 很強大,常見包含 List、Vector、Set、Map。搭配 map、filter、foreach、fold 等方法,可以快速完成資料轉換。
Listval nums = List(1, 2, 3, 4, 5)
val doubled = nums.map(_ * 2)
val evenNums = nums.filter(_ % 2 == 0)
val total = nums.sum
println(doubled) // List(2, 4, 6, 8, 10)
println(evenNums) // List(2, 4)
println(total) // 15
Mapval scores = Map("Amy" -> 90, "Bob" -> 75, "Cindy" -> 88)
println(scores("Amy"))
println(scores.get("David")) // None
Scala 提供 for ... yield 的簡潔語法,用來表達序列轉換與組合,常被視為比多層 map/flatMap 更易讀的寫法之一。
for yieldval data = List(1, 2, 3, 4, 5)
val squares =
for n <- data if n % 2 == 1
yield n * n
println(squares) // List(1, 9, 25)
🏗️ 物件導向與 Case Class
class / objectclass Person(val name: String, var age: Int):
def introduce(): String =
s"我是 $name,今年 $age 歲"
object PersonApp:
def run(): Unit =
val p = Person("小華", 25)
println(p.introduce())
Case class 很適合用來描述不可變資料模型,像是訂單、使用者、商品、事件等。官方文件也特別指出,它非常適合搭配模式比對使用。
case classcase class User(name: String, age: Int)
val user1 = User("Amy", 28)
val user2 = user1.copy(age = 29)
println(user1)
println(user2)
🧩 模式比對 Pattern Matching
模式比對是 Scala 很重要的語言特性。它不只是像傳統 switch 那樣做分支判斷,還能在匹配成功時,直接把資料拆解出來,因此在處理 case class、集合與代數資料型別時非常好用。
基本 matchval x: Int = 1
val text = x match
case 0 => "zero"
case 1 => "one"
case _ => "other"
println(text)
case class + matchcase class Book(title: String, price: Int)
def label(book: Book): String =
book match
case Book(title, price) if price >= 500 =>
s"$title 是高價書"
case Book(title, _) =>
s"$title 是一般書"
println(label(Book("Scala 入門", 680)))
println(label(Book("FP 簡介", 320)))
為什麼模式比對重要?
因為它讓「條件判斷 + 資料拆解」一次完成,能讓程式碼更簡潔、更安全,也更容易擴充。
⏳ Future 與非同步處理
在 Scala 中,Future 可以被理解成「未來某個時間才會拿到的值」。它很適合處理像是 API 請求、資料庫存取、背景運算等較慢的工作,讓程式不必卡住等待,而能繼續做其他事。
Futureimport scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def fetchData(): Future[String] =
Future {
Thread.sleep(1000)
"資料載入完成"
}
@main def futureDemo(): Unit =
fetchData().foreach(result => println(result))
println("主程式先繼續往下執行")
Future 預設偏向非阻塞思維,通常會搭配 callback 或組合器操作結果,而不是一直等待結果完成。
💡 範例應用
範例 1:學生成績等級判斷
應用例def grade(score: Int): String =
score match
case s if s >= 90 => "A"
case s if s >= 80 => "B"
case s if s >= 70 => "C"
case s if s >= 60 => "D"
case _ => "F"
println(grade(86))
應用到:函式、條件判斷、match。
範例 2:待辦事項資料模型
應用例case class Todo(id: Int, title: String, done: Boolean)
val todos = List(
Todo(1, "學習 Scala 基礎", true),
Todo(2, "練習集合操作", false),
Todo(3, "完成小專案", false)
)
val pendingTitles =
todos
.filter(!_.done)
.map(_.title)
println(pendingTitles)
應用到:case class、List、filter、map。
範例 3:字串詞頻統計
應用例val text = "scala is simple and scala is powerful"
val counts =
text.split(" ")
.groupBy(identity)
.view
.mapValues(_.length)
.toMap
println(counts)
應用到:字串切割、groupBy、Map 統計。
範例 4:簡單訂單總價
應用例case class Item(name: String, price: Int, qty: Int)
val cart = List(
Item("鍵盤", 1200, 1),
Item("滑鼠", 800, 2)
)
val total = cart.map(item => item.price * item.qty).sum
println(s"總金額:$total")
應用到:資料建模、map、sum。
📝 Scala 小測驗
作答後按下「批改測驗」,系統會立即顯示分數與學習建議。
1. 在 Scala 中,哪一個關鍵字通常用來宣告不可變值?
2. 下列哪一個最適合描述 Scala 的特性?
3. 哪一段語法是 Scala 的模式比對入口?
4. 哪個集合操作會把每個元素轉換成新值?
5. Future 最適合用在哪種場景?
6. Case class 的常見用途是什麼?
查看測驗重點整理
val:不可變值- Scala:同時支援 OOP 與 FP
match:模式比對核心map:元素轉換Future:非同步結果容器case class:資料建模與模式比對好夥伴
🔗 Scala 編程語言中文教學網站 | 香港編程學院 | Scala課程
Scala 是一種結合物件導向與函數式編程的現代語言,擁有靜態型別、安全的型別系統,以及與 JVM 生態系高度相容的優勢。這個教學網站以 Scala 3 為核心,從入門語法一路帶你走到集合操作、模式比對、非同步處理與實用範例。