一、Scala
1、概述
- 官网地址:https://www.scala-lang.org
- Github项目地址:https://github.com/scala/scala3/
Scala 是 Scalable Language 的简写,意味着这种语言设计上支持大规模软件开发,是一门多范式的编程语言。
Scala 语言是由 Martin Odersky 等人在 2003 年开发的,并于 2004 年首次发布。
Scala 运行于 Java 平台(Java 虚拟机),并兼容现有的 Java 程序。
Scala 的编译模型(独立编译,动态类加载)与 Java 和 C# 一样,所以 Scala 代码可以调用 Java 类库(对于.NET实现则可调用.NET类库)。
3、安装Scala
这里采用压缩包+环境配置方式,其他方法可参考官网:Install Scala on your computer
shell
wget https://github.com/scala/scala3/releases/download/3.3.5/scala3-3.3.5.tar.gz
tar -xzf scala3-3.3.5.tgz
echo "export SCALA_HOME=/path/to/scala3-3.3.5" > ~/.zshrc
echo "export PATH=$SCALA_HOME/bin:$PATH" > ~/.zshrc
source ~/.zshrc
2、基础语法
4、区分 class、object、case class、trait、
4.1 class(普通类)
-
定义:用于创建对象的模板,包含字段、方法、构造函数。
-
特点:
- 默认成员(字段、方法)是公开的(public)。
- 支持继承(单继承)。
- 必须显式使用 new 关键字实例化。
-
示例:
scalaclass Person(name: String, age: Int) { def greet(): String = s"Hello, I'm $name, $age years old." } val person = new Person("Alice", 30) println(person.greet()) // 输出:Hello, I'm Alice, 30 years old.
4.2 object(单例对象)
-
定义:全局唯一的单例实例,用于替代静态成员或工具类。
-
特点:
- 不能实例化(无构造函数)。
- 可以直接访问其成员(类似静态调用)。
- 常与类同名作为 伴生对象(Companion Object),共享私有成员。
-
示例:
scala// 单例对象(工具类) object MathUtils { def square(x: Int): Int = x * x } println(MathUtils.square(5)) // 输出:25 // 伴生对象(与类同名) class Person(val name: String) object Person { def apply(name: String): Person = new Person(name) } val person = Person("Alice") // 调用伴生对象的 apply 方法
4.3 trait(特质)
-
定义:类似于 Java 的接口,但支持方法实现和字段。
-
特点:
- 支持多重继承(一个类可混入多个 trait)。
- 可以定义抽象方法(无实现)和具体方法(有实现)。
- 不能有构造函数参数。
-
示例:
scalatrait Speaker { def speak(): String // 抽象方法 } trait Runner { def run(): Unit = println("Running...") // 具体方法 } class Dog extends Speaker with Runner { def speak(): String = "Woof!" } val dog = new Dog println(dog.speak()) // 输出:Woof! dog.run() // 输出:Running...
4.4 case class(样例类)
-
定义:专为不可变数据建模设计的类,编译器自动生成实用方法。
-
特点:
- 自动生成 equals、hashCode、toString 方法。
- 支持模式匹配(unapply 方法自动生成)。
- 无需 new 实例化(通过伴生对象的 apply 方法)。
- 构造函数参数默认是 val(不可变)。
-
示例:
scalacase class Person(name: String, age: Int) val alice = Person("Alice", 30) // 无需 new val bob = alice.copy(name = "Bob") // 创建新实例(不可变性) // 模式匹配 alice match { case Person(n, a) => println(s"Name: $n, Age: $a") }
4.5 case object
-
定义:case object 是一个单例对象(全局唯一实例),编译器会为其自动生成一些实用方法。
-
核心特性:
- 不可变单例:与普通 object 一样,case object 是全局唯一的,不可实例化。
- 自动生成方法:
- toString:返回对象名称(如 case object Foo 的 toString 为 "Foo")。
- equals/hashCode:基于对象身份(单例特性)比较。
- 模式匹配友好:可直接用于模式匹配,无需参数。
-
示例:在密封特质(sealed trait)中,使用 case object 表示固定选项或消息:
scalasealed trait Message case object Start extends Message case object Stop extends Message def handleMessage(msg: Message): Unit = msg match { case Start => println("System starting...") case Stop => println("System stopping...") }
4.6 伴生对象(Companion Object)
-
定义:与类同名的 object,用于存放类的静态工厂方法或共享逻辑。
-
作用:
- 实现 apply 方法(简化对象创建)。
- 实现 unapply 方法(支持模式匹配)。
- 访问类的私有成员。
-
示例:
scalaclass Person private(val name: String) object Person { // 工厂方法 def apply(name: String): Person = new Person(name) // 模式匹配提取器 def unapply(p: Person): Option[String] = Some(p.name) } val person = Person("Alice") // 调用 apply 方法 person match { case Person(n) => println(n) // 输出:Alice }
二、sbt
1、概述
- sbt官网地址:https://www.scala-sbt.org
sbt(Scala Build Tool) 是一个专为 Scala 和 Java 项目 设计的开源构建工具,类似于 Java 的 Maven 或 Gradle,但针对 Scala 生态进行了深度优化。
2、安装
scala
wget https://github.com/sbt/sbt/releases/download/v1.10.7/sbt-1.10.7.tgz
tar -zxvf sbt-1.10.7.tgz
echo "export SBT_HOME=/path/to/sbt" > ~/.zshrc
echo "export PATH=$SBT_HOME/bin:$PATH" > ~/.zshrc
source ~/.zshrc
sbt -version
3、sbt 的核心功能
-
项目构建与编译
- 自动化编译:根据代码变动自动增量编译,减少等待时间。
- 跨版本编译:支持为不同 Scala 版本生成字节码(如同时支持 Scala 2.13 和 Scala 3)。
- 多模块管理:轻松管理包含多个子模块的复杂项目。
-
依赖管理
-
从仓库拉取库:自动从 Maven Central、Sonatype 等仓库下载依赖项。
-
声明式依赖配置:在 build.sbt 中通过简洁语法声明依赖:
scalalibraryDependencies += "org.typelevel" %% "cats-core" % "2.10.0"
-
-
任务执行
- 运行测试:通过 sbt test 执行单元测试。
- 打包应用:生成 JAR、WAR 或 Docker 镜像(需插件支持)。
- 启动应用:直接运行主类或热部署开发服务器。
-
插件扩展
- 生态丰富:通过插件支持代码格式化(sbt-scalafmt)、静态分析(sbt-scapegoat)、文档生成(sbt-site)等。
- 自定义任务:编写插件或内联任务扩展构建流程。
-
交互式命令行
- REPL 集成:通过 sbt console 进入 Scala REPL,直接调用项目代码。
- 持续命令模式:执行 ~test 或 ~run,代码保存后自动重新编译并运行。
4、sbt 的核心优势
特性 | sbt | Maven/Gradle |
---|---|---|
配置语法 | 基于 Scala DSL,灵活易扩展 | XML(Maven)或 Groovy(Gradle) |
增量编译 | 原生支持,速度更快 | 需插件支持(如 Gradle 增量编译) |
Scala 生态集成 | 深度优化(如交叉编译) | 通用支持,需额外配置 |
交互式体验 | 提供命令自动补全和历史记录 | 无交互式 CLI |
5、sbt 的典型使用场景
-
开发 Scala 应用:从零创建 Web 服务(如 Play Framework)、数据分析工具或库。
scalasbt new scala/scala3.g8 # 创建 Scala 3 项目模板 sbt compile # 编译代码 sbt run # 运行主程序
-
管理多模块项目:定义父子模块,共享配置,独立编译:
scala// build.sbt lazy val core = project.in(file("core")).settings(/* 核心模块配置 */) lazy val api = project.in(file("api")).dependsOn(core)
-
持续集成(CI):在 Jenkins、GitHub Actions 中通过 sbt test 自动化测试和部署。
6、sbt 项目的基础结构
scala
my-project/
├── build.sbt # 项目配置(依赖、插件、任务)
├── project/ # 元配置(插件定义、全局设置)
│ ├── build.properties # 指定 sbt 版本
│ └── plugins.sbt # 插件依赖
├── src/
│ ├── main/
│ │ ├── scala/ # Scala 源代码
│ │ └── resources # 配置文件
│ └── test/ # 测试代码和资源
└── target/ # 编译输出目录
7、常用 sbt 命令速查
命令 | 作用 |
---|---|
sbt compile | 编译源代码 |
sbt test | 运行所有测试 |
sbt run | 执行主程序 |
sbt package | 打包为 JAR 文件 |
sbt clean | 清理编译生成的文件 |
sbt update | 更新依赖库 |
sbt console | 进入 Scala REPL(可调用项目代码) |
sbt reload | 重新加载构建配置(修改后必用) |
8、为什么选择 sbt?
- 为 Scala 量身定制:语法与 Scala 无缝衔接,支持最新语言特性。
- 高效开发体验:增量编译和交互式命令大幅提升效率。
- 社区支持:Scala 生态中主流库均提供 sbt 支持。