命令与语法模板

常用命令 + 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、格式化输出串起来的模板
SCALA
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");处理一组数据先想“元组 + 集合高阶函数”;每个函数/方法只做一件事。