第1章:基础
一、导读
1.1 本章学习目标
第1章讲解 Scala 的基础语法:val/var、类型推断、字符串插值、REPL。
本章核心学习目标:
- 理解 val 和 var 的区别:不可变 vs 可变
- 掌握类型推断:Scala 如何推断类型
- 理解 Scala 的表达式风格:几乎所有东西都是表达式
- 掌握字符串插值
1.2 为什么本章如此重要
Scala 融合了面向对象和函数式编程。理解 val/var 和表达式风格是掌握 Scala 的基础。
1.3 核心问题引导
为什么 Scala 推荐使用 val 而非 var?
Scala 的类型推断如何工作?
if/for/try 在 Scala 中是表达式还是语句?
二、核心概念详解
2.1 val 和 var
scala
// val: 不可变绑定
val x = 42
// x = 43 // 编译错误: val 不能重新赋值
// var: 可变绑定
var y = 10
y = 20 // OK
// 推荐: 优先使用 val
// val 更安全、更容易推理、支持并发
// 类型声明 (可选)
val name: String = "Alice"
val age: Int = 302.2 类型推断
scala
// Scala 自动推断类型
val x = 42 // Int
val pi = 3.14 // Double
val greeting = "Hello" // String
val flag = true // Boolean
// 集合
val nums = List(1, 2, 3) // List[Int]
val map = Map("a" -> 1, "b" -> 2) // Map[String, Int]
// 函数
val add = (a: Int, b: Int) => a + b // (Int, Int) => Int2.3 表达式
scala
// if 是表达式,有返回值
val result = if (x > 0) "positive" else "non-positive"
// for 是表达式
val squares = for (i <- 1 to 5) yield i * i
// Vector(1, 4, 9, 16, 25)
// try 是表达式
val parsed = try {
"42".toInt
} catch {
case _: NumberFormatException => 0
}
// 块也是表达式
val answer = {
val a = 10
val b = 20
a + b // 最后一个表达式的值
}2.4 字符串插值
scala
val name = "Alice"
val age = 30
// s 插值器
println(s"Name: $name, Age: $age")
println(s"Next year: ${age + 1}")
// f 插值器 (格式化)
val pi = 3.14159
println(f"Pi is approximately $pi%.2f") // 3.14
// raw 插值器 (不处理转义)
println(raw"No\nnewline") // No\nnewline三、实战案例
3.1 案例一:FizzBuzz
scala
// 函数式风格
def fizzBuzz(n: Int): String = (n % 3, n % 5) match {
case (0, 0) => "FizzBuzz"
case (0, _) => "Fizz"
case (_, 0) => "Buzz"
case _ => n.toString
}
for (i <- 1 to 100) {
println(fizzBuzz(i))
}
// 更简洁的版本
val result = (1 to 100).map { i =>
val fizz = if (i % 3 == 0) "Fizz" else ""
val buzz = if (i % 5 == 0) "Buzz" else ""
val fb = fizz + buzz
if (fb.isEmpty) i.toString else fb
}
result.foreach(println)四、本章小结
val 不可变,var 可变,优先使用 val
Scala 有强大的类型推断
几乎所有结构都是表达式,有返回值
五、思考与练习
为什么不可变性对并发编程很重要?
Scala 的 Unit 类型和 Java 的 void 有什么区别?