命令与语法模板
常用命令 + 10 个能直接套用的语法模板,上课上机时对着抄。
一、常用命令
| 命令 | 作用 |
|---|---|
sbt --version | 查看 sbt 版本,确认环境已安装 |
sbt new scala/hello-world.g8 | 用官方 Giter8 模板新建一个 hello-world 项目 |
sbt compile | 编译 src/main/scala 下的主源码 |
sbt run | 编译并运行项目主类,多个 main 时会提示选择 |
sbt "runMain pkg.Hello" | 按完整类名指定运行某个 main 对象 |
sbt console | 启动 Scala REPL,并自动加载当前项目的 classpath |
sbt test | 运行 src/test/scala 下的测试 |
sbt clean | 删除 target 下的编译产物,常与 compile/test 连用 |
scalac Hello.scala | 用 Scala 编译器编译源文件,生成 Hello.class |
scala Hello | 在 Scala 2.13 下运行已编译且带 main 方法的 Hello 类 |
scala Hello.scala | 直接运行单个 .scala 脚本;scala-cli 也支持此用法 |
二、语法模板
| 类别 | 写法 |
|---|---|
| 变量 | val name = "张三" // 需要可变时再用 var count = 0 |
| 字符串插值 | s"$name 共 ${xs.size} 条" |
| 条件表达式 | val grade = if (score >= 60) "及格" else "不及格" |
| 循环 / 推导式 | for (i <- 1 to 10 if i % 2 == 0) yield i // 去掉 yield 就是普通循环 |
| 模式匹配 | x match { case 1 => "一"; case _ => "其他" } |
| 函数 | def add(a: Int, b: Int = 1): Int = a + b |
| 高阶函数 | xs.map(_ * 2).filter(_ > 10) |
| 类 / 样例类 | case class User(id: Int, name: String) // 普通类:class Person(val name: String) |
| 集合分组 | rows.groupBy(_.cls).view.mapValues(_.size).toMap // 2.13 需要 toMap |
| 文件读取 | scala.io.Source.fromFile("a.csv").getLines().toList |
三、一个最小可运行程序
▶ 把读文件、集合、模式匹配、groupBy、格式化输出串起来的模板
import scala.io.Source
object ScoreReport extends App {
// 读 CSV:每行 "班级,姓名,分数"
val rows: List[Array[String]] =
Source.fromFile("scores.csv", "UTF-8").getLines().drop(1).map(_.split(",")).toList
// 解析成 (班级, 分数),过滤掉脏数据
val items: List[(String, Double)] = rows.flatMap {
case Array(cls, _, score) => score.toDoubleOption.map(s => (cls.trim, s))
case _ => None
}
// 按班级分组求平均分,并按平均分降序
val report = items.groupBy(_._1)
.toList
.map { case (cls, xs) => (cls, xs.size, xs.map(_._2).sum / xs.size) }
.sortBy { case (_, _, avg) => -avg }
report.foreach { case (cls, n, avg) =>
println(f"$cls%-6s 人数=$n%3d 平均分=$avg%6.1f")
}
}记住三件事读文件用
Source.fromFile(path, "UTF-8");处理一组数据先想“元组 + 集合高阶函数”;每个函数/方法只做一件事。