Scala语言速查
变量与值
val name: String = "Alice" // 不可变
var age: Int = 28 // 可变
val pi = 3.14 // 类型推断
lazy val heavy = compute() // 延迟求值
模式匹配
val result = value match {
case 0 => "zero"
case n if n < 0 => "negative"
case n => s"positive: $n"
}
// 类型匹配
def describe(x: Any): String = x match {
case i: Int => s"int: $i"
case s: String => s"string: $s"
case _ => "unknown"
}
样例类和密封特质
// 样例类 — 自动 equals/hashCode/copy
case class User(name: String, age: Int)
val alice = User("Alice", 28)
val older = alice.copy(age = 29)
// 密封特质(代数数据类型)
sealed trait Shape
case class Circle(r: Double) extends Shape
case class Rect(w: Double, h: Double) extends Shape
def area(s: Shape): Double = s match {
case Circle(r) => Math.PI * r * r
case Rect(w, h) => w * h
}
集合
val list = List(1, 2, 3, 4, 5)
list.map(_ * 2) // List(2, 4, 6, 8, 10)
list.filter(_ > 2) // List(3, 4, 5)
list.foldLeft(0)(_ + _) // 15
list.groupBy(_ % 2) // Map(0 -> List(2,4), 1 -> List(1,3,5))
val map = Map("a" -> 1, "b" -> 2)
map.getOrElse("c", 0) // 0
// for 推导式
val pairs = for {
x <- List(1, 2, 3)
y <- List("a", "b")
} yield (x, y)
Option 和 Either
// Option — 避免 null
val maybeUser: Option[User] = findUser(id)
maybeUser.map(_.name).getOrElse("Guest")
maybeUser.foreach(u => println(u.name))
// Either — 错误处理
def parse(s: String): Either[String, Int] =
s.toIntOption.toRight(s"Not a number: $s")
parse("42") // Right(42)
parse("foo") // Left("Not a number: foo")