Scala 編程語言中文教學網站 | 香港編程學院 | Scala課程
前往小測驗

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 程式
Scala 3@main def hello(): Unit =
  println("Hello, Scala!")
重點:Scala 3 提供 @main 作為程式進入點,讓撰寫命令列程式更簡潔。

✍️ 基礎語法

1. 單行輸出
輸出println("Scala 很適合寫資料處理與後端服務")
2. 註解
註解// 這是單行註解

/*
  這是多行註解
*/
3. 縮排風格

Scala 3 支援更現代的縮排寫法,某些情況下可以省略大括號,使程式看起來更乾淨。

if 範例val score = 88

if score >= 60 then
  println("及格")
else
  println("不及格")
注意:你也可以使用傳統大括號寫法,但 Scala 3 的縮排風格更常見於新教學與新專案。

📦 型別與變數

val 與 var

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
Scala 具有良好的型別推導能力,因此很多時候你可以不明寫型別,但在 API 設計或教學中,適度標示型別仍很重要。

🔀 流程控制

if / else
條件判斷val temperature = 30

val message =
  if temperature >= 28 then "天氣偏熱"
  else "天氣舒適"

println(message)
for 迴圈
forfor i <- 1 to 5 do
  println(s"第 $i 次執行")
while 迴圈
whilevar count = 3
while count > 0 do
  println(count)
  count -= 1
match 表達式
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 很強大,常見包含 ListVectorSetMap。搭配 mapfilterforeachfold 等方法,可以快速完成資料轉換。

List 基礎
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
Map 基礎
Mapval scores = Map("Amy" -> 90, "Bob" -> 75, "Cindy" -> 88)

println(scores("Amy"))
println(scores.get("David")) // None
for-comprehension

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 class 很適合用來描述不可變資料模型,像是訂單、使用者、商品、事件等。官方文件也特別指出,它非常適合搭配模式比對使用。

case classcase class User(name: String, age: Int)

val user1 = User("Amy", 28)
val user2 = user1.copy(age = 29)

println(user1)
println(user2)
自動生成建構與解構支援
適合不可變資料
方便搭配 match

🧩 模式比對 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
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 為核心,從入門語法一路帶你走到集合操作、模式比對、非同步處理與實用範例。