633 lines
9.9 KiB
Markdown
633 lines
9.9 KiB
Markdown
# scala_20260908
|
||
|
||
Scala 学习代码仓库,记录从 **2026-09-08** 开始的 Scala 学习过程。
|
||
|
||
本仓库主要用于保存:
|
||
|
||
- 线下课程中的课堂代码
|
||
- 使用 ChatGPT 辅助学习时编写的练习代码
|
||
- 对 Scala 语法、特性和容易混淆知识点的实验与验证
|
||
|
||
目前项目以 **Scala 2.11.12 + JDK 8 + Maven** 为主要开发环境。
|
||
|
||
---
|
||
|
||
## 一、仓库定位
|
||
|
||
这个仓库不是一个完整的业务项目,而是一个持续积累的 **Scala 学习工程**。
|
||
|
||
整个学习过程分成两条线:
|
||
|
||
```text
|
||
Scala 学习
|
||
│
|
||
┌──────────┴──────────┐
|
||
│ │
|
||
chapter practise
|
||
│ │
|
||
线下课程代码 ChatGPT 辅助学习
|
||
│ │
|
||
跟随老师学习 理解 / 补充 / 练习
|
||
│ │
|
||
└──────────┬──────────┘
|
||
│
|
||
知识掌握
|
||
```
|
||
|
||
### `chapter`
|
||
|
||
保存线下课程代码。
|
||
|
||
主要目标:
|
||
|
||
- 记录老师课堂上的示例代码
|
||
- 对应线下课程章节
|
||
- 保留课堂学习过程
|
||
- 方便课后复习
|
||
- 尽量保持与课堂进度一致
|
||
|
||
可以把它理解为:
|
||
|
||
> **课堂笔记的代码版**
|
||
|
||
### `practise`
|
||
|
||
保存自主练习代码,主要是使用 ChatGPT 辅助学习过程中产生的代码。
|
||
|
||
主要目标:
|
||
|
||
- 补充课堂知识
|
||
- 针对某个知识点单独练习
|
||
- 根据自己的理解重新实现
|
||
- 编写练习题
|
||
- 编写综合题
|
||
- 验证 Scala 语法特性
|
||
- 研究容易混淆的概念
|
||
|
||
可以把它理解为:
|
||
|
||
> **自己练习、实验和深入理解 Scala 的代码区**
|
||
|
||
---
|
||
|
||
## 二、当前学习进度
|
||
|
||
目前已经完成 Scala 基础语法以及 **方法、函数** 相关内容的学习。
|
||
|
||
### 已学习内容
|
||
|
||
```text
|
||
Scala 基础
|
||
│
|
||
├── 变量与常量
|
||
│ ├── val
|
||
│ └── var
|
||
│
|
||
├── 数据类型
|
||
│ ├── 类型推断
|
||
│ ├── 显式类型声明
|
||
│ ├── 基本数据类型
|
||
│ ├── 类型转换
|
||
│ └── 隐式转换
|
||
│
|
||
├── 字符串
|
||
│ ├── String
|
||
│ ├── 字符串插值
|
||
│ ├── ==
|
||
│ └── eq
|
||
│
|
||
├── 运算符
|
||
│ ├── 算术运算符
|
||
│ ├── 比较运算符
|
||
│ ├── 逻辑运算符
|
||
│ └── 赋值运算符
|
||
│
|
||
├── 流程控制
|
||
│ ├── if / else
|
||
│ ├── for
|
||
│ └── 其他基础控制结构
|
||
│
|
||
└── 方法与函数
|
||
├── def
|
||
├── 方法参数
|
||
├── 返回值
|
||
├── 函数
|
||
├── Lambda
|
||
├── 函数类型
|
||
├── 函数作为参数
|
||
└── 高阶函数基础
|
||
```
|
||
|
||
---
|
||
|
||
## 三、项目结构
|
||
|
||
当前源码位于 `src/main/scala`。
|
||
|
||
```text
|
||
scala_20260908/
|
||
│
|
||
├── pom.xml
|
||
├── README.md
|
||
│
|
||
└── src/
|
||
└── main/
|
||
└── scala/
|
||
│
|
||
├── chapter1/
|
||
│ ├── demo1/
|
||
│ ├── demo2/
|
||
│ ├── demo3/
|
||
│ ├── demo4/
|
||
│ └── exercises/
|
||
│
|
||
├── chapter2/
|
||
│ └── demo1/
|
||
│ └── DemoMethod.scala
|
||
│
|
||
├── practise1/
|
||
│ ├── demo/
|
||
│ ├── exercises/
|
||
│ └── comprehensive/
|
||
│
|
||
└── practise2/
|
||
├── demo/
|
||
├── exercises/
|
||
└── comprehensive/
|
||
```
|
||
|
||
当前仓库已经按照课程和自主练习进行了明确区分。
|
||
|
||
---
|
||
|
||
## 四、目录说明
|
||
|
||
### 1. `chapter1`
|
||
|
||
线下课程第一阶段代码。
|
||
|
||
当前主要围绕 Scala 基础语法,包括:
|
||
|
||
- 变量与常量
|
||
- 数据类型
|
||
- 字符串
|
||
- 字符串插值
|
||
- 运算符
|
||
- 流程控制
|
||
- 基础练习
|
||
|
||
目录按照课堂知识点划分:
|
||
|
||
```text
|
||
chapter1/
|
||
├── demo1/
|
||
├── demo2/
|
||
├── demo3/
|
||
├── demo4/
|
||
└── exercises/
|
||
```
|
||
|
||
其中:
|
||
|
||
```text
|
||
demo
|
||
↓
|
||
课堂知识点示例
|
||
|
||
exercises
|
||
↓
|
||
课堂练习
|
||
```
|
||
|
||
---
|
||
|
||
### 2. `chapter2`
|
||
|
||
线下课程后续章节。
|
||
|
||
当前已包含:
|
||
|
||
```text
|
||
chapter2/
|
||
└── demo1/
|
||
└── DemoMethod.scala
|
||
```
|
||
|
||
这一部分开始进入:
|
||
|
||
- 方法
|
||
- 方法参数
|
||
- 返回值
|
||
- 方法调用
|
||
|
||
并逐步衔接到 Scala 函数相关内容。citeturn733546view1
|
||
|
||
---
|
||
|
||
### 3. `practise1`
|
||
|
||
第一阶段自主练习。
|
||
|
||
目录划分为:
|
||
|
||
```text
|
||
practise1/
|
||
├── demo/
|
||
├── exercises/
|
||
└── comprehensive/
|
||
```
|
||
|
||
含义:
|
||
|
||
```text
|
||
demo
|
||
↓
|
||
针对知识点重新编写示例
|
||
|
||
exercises
|
||
↓
|
||
针对单个知识点进行练习
|
||
|
||
comprehensive
|
||
↓
|
||
综合多个知识点完成练习
|
||
```
|
||
|
||
---
|
||
|
||
### 4. `practise2`
|
||
|
||
第二阶段自主练习,目前主要围绕 **方法与函数** 继续学习。
|
||
|
||
目录划分为:
|
||
|
||
```text
|
||
practise2/
|
||
├── demo/
|
||
├── exercises/
|
||
└── comprehensive/
|
||
```
|
||
|
||
重点包括:
|
||
|
||
- `def`
|
||
- 方法与函数的区别
|
||
- Lambda 表达式
|
||
- 函数类型
|
||
- 函数参数
|
||
- 函数返回值
|
||
- 函数作为参数
|
||
- 高阶函数基础
|
||
|
||
当前仓库中的 `practise2` 与 `chapter2` 已经开始对应方法、函数这一阶段的学习。citeturn733546view1turn733546view3
|
||
|
||
---
|
||
|
||
## 五、方法与函数核心理解
|
||
|
||
这是当前学习阶段的重要内容。
|
||
|
||
### 方法
|
||
|
||
使用 `def` 定义:
|
||
|
||
```scala
|
||
def add(a: Int, b: Int): Int = {
|
||
a + b
|
||
}
|
||
```
|
||
|
||
方法可以直接调用:
|
||
|
||
```scala
|
||
println(add(10, 20))
|
||
```
|
||
|
||
---
|
||
|
||
### 函数
|
||
|
||
函数可以赋值给变量:
|
||
|
||
```scala
|
||
val add = (a: Int, b: Int) => a + b
|
||
```
|
||
|
||
这里:
|
||
|
||
```text
|
||
add
|
||
↓
|
||
函数变量名
|
||
|
||
(Int, Int) => Int
|
||
↓
|
||
函数类型
|
||
|
||
(a, b) => a + b
|
||
↓
|
||
具体的 Lambda 函数
|
||
```
|
||
|
||
---
|
||
|
||
### 函数作为参数
|
||
|
||
例如:
|
||
|
||
```scala
|
||
def operate(
|
||
a: Int,
|
||
b: Int,
|
||
f: (Int, Int) => Int
|
||
): Int = {
|
||
f(a, b)
|
||
}
|
||
```
|
||
|
||
调用:
|
||
|
||
```scala
|
||
println(
|
||
operate(
|
||
10,
|
||
20,
|
||
(a, b) => a + b
|
||
)
|
||
)
|
||
```
|
||
|
||
可以把它理解成:
|
||
|
||
```text
|
||
f
|
||
↓
|
||
只是一个函数变量名
|
||
|
||
(Int, Int) => Int
|
||
↓
|
||
f 的函数类型
|
||
|
||
(a, b) => a + b
|
||
↓
|
||
传入的具体函数
|
||
|
||
f(a, b)
|
||
↓
|
||
调用这个函数
|
||
```
|
||
|
||
这也是 Scala 函数式编程中非常重要的基础。
|
||
|
||
---
|
||
|
||
## 六、开发环境
|
||
|
||
当前项目使用 Maven 管理。
|
||
|
||
### 环境
|
||
|
||
| 工具 | 版本 |
|
||
| --- | --- |
|
||
| JDK | 8 |
|
||
| Scala | 2.11.12 |
|
||
| Maven | 3.x |
|
||
| IDE | IntelliJ IDEA |
|
||
| scala-maven-plugin | 4.8.1 |
|
||
|
||
项目中的 `pom.xml` 使用 `scala-maven-plugin` 编译 Scala 源代码,并以 Java 8 作为编译目标。citeturn210862view1
|
||
|
||
---
|
||
|
||
## 七、运行项目
|
||
|
||
### IntelliJ IDEA
|
||
|
||
推荐直接使用 IntelliJ IDEA。
|
||
|
||
操作步骤:
|
||
|
||
1. 用 IDEA 打开项目
|
||
2. 安装 Scala 插件
|
||
3. 打开任意 `.scala` 文件
|
||
4. 找到包含 `main` 方法的 `object`
|
||
5. 右键运行 `Run 'XXX.main()'`
|
||
|
||
例如:
|
||
|
||
```scala
|
||
object Demo {
|
||
def main(args: Array[String]): Unit = {
|
||
println("Hello Scala")
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Maven
|
||
|
||
编译:
|
||
|
||
```bash
|
||
mvn clean compile
|
||
```
|
||
|
||
运行指定的 Scala 主类:
|
||
|
||
```bash
|
||
mvn scala:run -DmainClass=chapter2.demo1.DemoMethod
|
||
```
|
||
|
||
例如自主练习中的入口:
|
||
|
||
```bash
|
||
mvn scala:run -DmainClass=practise2.demo.DemoFunction
|
||
```
|
||
|
||
项目当前 README 中也采用这种 Maven 运行方式。citeturn210862view2
|
||
|
||
---
|
||
|
||
## 八、学习方式
|
||
|
||
当前采用:
|
||
|
||
```text
|
||
线下课程
|
||
↓
|
||
chapter
|
||
↓
|
||
理解老师讲解的知识
|
||
↓
|
||
ChatGPT 辅助学习
|
||
↓
|
||
practise
|
||
↓
|
||
自己重新实现
|
||
↓
|
||
练习题
|
||
↓
|
||
综合题
|
||
↓
|
||
验证和总结
|
||
```
|
||
|
||
### 学习原则
|
||
|
||
`chapter`:
|
||
|
||
> **老师怎么讲,就尽量怎么记录。**
|
||
|
||
`practise`:
|
||
|
||
> **把知识真正理解并自己写出来。**
|
||
|
||
两者不是两个独立的项目,而是同一个学习过程中的不同阶段。
|
||
|
||
---
|
||
|
||
## 九、代码组织原则
|
||
|
||
### `chapter`:以课程为中心
|
||
|
||
```text
|
||
chapter1
|
||
chapter2
|
||
chapter3
|
||
...
|
||
```
|
||
|
||
随着线下课程继续推进,按课程章节持续增加。
|
||
|
||
尽量不要为了代码“漂亮”而修改课堂代码结构,因为这里最重要的是:
|
||
|
||
> **能够快速回忆当时老师讲了什么。**
|
||
|
||
---
|
||
|
||
### `practise`:以理解为中心
|
||
|
||
```text
|
||
practise1
|
||
practise2
|
||
practise3
|
||
...
|
||
```
|
||
|
||
每个练习阶段可以继续拆分:
|
||
|
||
```text
|
||
demo
|
||
exercises
|
||
comprehensive
|
||
test
|
||
experiment
|
||
```
|
||
|
||
其中允许存在专门为了理解某个 Scala 特性而编写的实验代码。
|
||
|
||
---
|
||
|
||
## 十、推荐的学习路径
|
||
|
||
后续可以沿着下面的路线继续学习:
|
||
|
||
```text
|
||
基础语法
|
||
↓
|
||
变量与数据类型
|
||
↓
|
||
流程控制
|
||
↓
|
||
方法与函数
|
||
↓
|
||
函数式编程基础
|
||
↓
|
||
集合
|
||
↓
|
||
高阶函数
|
||
↓
|
||
面向对象
|
||
↓
|
||
Trait
|
||
↓
|
||
继承
|
||
↓
|
||
隐式转换
|
||
↓
|
||
Scala 集合操作
|
||
↓
|
||
模式匹配
|
||
↓
|
||
Option / Either / Try
|
||
↓
|
||
并发与异步
|
||
↓
|
||
Spark
|
||
↓
|
||
大数据开发
|
||
```
|
||
|
||
最终目标不是只会写 Scala 语法,而是建立:
|
||
|
||
```text
|
||
Scala 基础
|
||
+
|
||
函数式编程思维
|
||
+
|
||
面向对象编程
|
||
+
|
||
集合处理能力
|
||
+
|
||
实际项目开发能力
|
||
```
|
||
|
||
---
|
||
|
||
## 十一、Git 提交习惯
|
||
|
||
当前项目主要使用语义化的提交信息,例如:
|
||
|
||
```text
|
||
feat: 线下课:流程控制、方法和函数
|
||
feat: 更新README
|
||
feat: 更新目录
|
||
```
|
||
|
||
后续建议继续保持简单统一的提交风格:
|
||
|
||
```text
|
||
feat: 新增某个知识点代码
|
||
fix: 修复示例代码问题
|
||
refactor: 调整代码结构
|
||
docs: 更新README或学习说明
|
||
```
|
||
|
||
---
|
||
|
||
## 十二、学习记录
|
||
|
||
这个仓库会随着学习过程持续更新。
|
||
|
||
因此 README 中的内容代表的是:
|
||
|
||
> **当前学习进度,而不是 Scala 最终完整知识体系。**
|
||
|
||
后续学习到新的内容后,继续按照下面的原则添加即可:
|
||
|
||
```text
|
||
线下课程
|
||
→ chapter
|
||
|
||
自主学习
|
||
→ practise
|
||
```
|
||
|
||
这样可以长期保持仓库结构清晰,也方便以后回头复习。
|
||
|
||
---
|
||
|
||
## License
|
||
|
||
个人 Scala 学习代码,仅用于学习、练习和知识整理。 |