跳到正文
Joeplover
学习笔记·2025-06-20·约 3 分钟阅读

Scala 3 入门:第一个 Scala 程序

用 Scala 3.3.6 和 sbt 搭建的入门 Demo,展示 Scala 语言基础语法、JVM 互操作性和函数式编程思维。

Scala 编程

Scala 3 入门:第一个 Scala 程序

背景

Scala 是一门兼具面向对象和函数式编程特性的语言,运行在 JVM 上。学习 Scala 是为了理解函数式编程范式,以及后续学习 Spark(Scala 是 Spark 的原生语言)。

为什么学 Scala

  • Spark 原生语言:Spark 的 DataFrame/Dataset API 用 Scala 编写最自然
  • 函数式编程思维:不可变数据结构、高阶函数、模式匹配——这些概念对写出高质量 Java 代码也有帮助
  • 类型系统强大:Scala 3 比 Scala 2 的类型系统更简洁,学习曲线更平缓
  • JVM 生态:可以和 Java 库无缝互操作

Scala 3 新语法

Scala 3(Dotty)相比 Scala 2 有显著变化,语法更简洁:

// Scala 2 风格
def add(x: Int, y: Int): Int = {
  return x + y
}

// Scala 3 风格(花括号变缩进,return 可省略)
def add(x: Int, y: Int): Int = x + y

// 更简短的写法(类型推断)
def add(x: Int, y: Int) = x + y

基本语法对比(Java vs Scala)

// 1. 变量定义
val x = 5          // 不可变(final),推荐使用
var y = "hello"    // 可变

// 2. 函数是一等公民
val square = (x: Int) => x * x  // 匿名函数
List(1,2,3).map(square)         // 高阶函数

// 3. 模式匹配(取代 switch)
def describe(x: Any): String = x match {
  case 1        => "one"
  case "hello"  => "greeting"
  case _        => "something else"
}

// 4. 样例类(case class)
// 自动生成 equals、hashCode、toString、copy
case class User(name: String, age: Int)
val user = User("Alice", 30)
val older = user.copy(age = 35)  // 不可变修改

与 Java 的互操作

Scala 可以直接调用 Java 库:

import java.util.ArrayList

val list = new ArrayList[String]()
list.add("hello")
list.add("world")

反过来,Java 也可以调用 Scala 类(前提是编译后的 class 文件在 classpath 上)。

函数式编程核心概念

不可变性: 默认 val(不可变引用),所有集合默认不可变。修改返回新集合,原集合不变。

val nums = List(1, 2, 3)
val doubled = nums.map(_ * 2)  // nums 不变,doubled = List(2, 4, 6)

高阶函数: 函数可以作为参数传递

def processNumbers(nums: List[Int], f: Int => Int): List[Int] =
  nums.map(f)

processNumbers(List(1,2,3), _ * 3)  // List(3, 6, 9)

总结

Scala 的学习重点不是语法细节,而是函数式编程思维。理解了 map/flatMap/filter/fold 这些高阶函数的用法,再看 Spark 的 transformation/action 就一目了然。Scala 3 的语法比 Scala 2 友好很多,入门门槛已经大幅降低。