【Scala】

一、Scala

1、概述

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 关键字实例化。
  • 示例:

    scala 复制代码
    class 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)。
    • 可以定义抽象方法(无实现)和具体方法(有实现)。
    • 不能有构造函数参数。
  • 示例:

    scala 复制代码
    trait 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(不可变)。
  • 示例:

    scala 复制代码
    case 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 表示固定选项或消息:

    scala 复制代码
    sealed 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 方法(支持模式匹配)。
    • 访问类的私有成员。
  • 示例:

    scala 复制代码
    class 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(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 中通过简洁语法声明依赖:

      scala 复制代码
      libraryDependencies += "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)、数据分析工具或库。

    scala 复制代码
    sbt 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 支持。

十、资料

相关推荐
luckyext1 小时前
Postman发送GET请求示例及注意事项
前端·后端·物联网·测试工具·小程序·c#·postman
架构文摘JGWZ1 小时前
SQLite?低调不是小众...
数据库·后端·学习·sqlite
dorabighead1 小时前
重构版:JavaScript 的 new 操作符——从“黑箱仪式”到“亲手造物”的认知跃迁
开发语言·javascript·重构
Humbunklung2 小时前
C#中通过Response.Headers设置自定义参数
开发语言·c#
uhakadotcom2 小时前
Pandas DataFrame 入门教程
后端·面试·github
Trouvaille ~2 小时前
【Java篇】一法不变,万象归一:方法封装与递归的思想之道
java·开发语言·面向对象·javase·递归·方法·基础入门
Asthenia04122 小时前
深入理解 Java 中的 ThreadLocal:从传统局限到 TransmittableThreadLocal 的解决方案
后端
勇哥java实战分享2 小时前
一次非常典型的 JVM OOM 事故 (要注意 where 1 = 1 哦)
后端
wtrees_松阳2 小时前
【编程向导】-JavaScript-基础语法-类型检测
开发语言·javascript·原型模式
Asthenia04122 小时前
ThreadLocal原理分析
后端