scala模式匹配

23 阅读1分钟
object class7 {
  case class Stu(name:String, yuwen:Double, shuxue:Double, yingyu:Double)

  def main(args: Array[String]): Unit = {
    // 0. 创建一个可变List
    val stuList = scala.collection.mutable.ListBuffer[Stu]()

    // 1. 读入文件 迭代器
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    lines.next() // 跳过第一行

    while(lines.hasNext){
      val line = lines.next()
      // 字符串拆分
      val li = line.split(":")
      stuList += Stu(li(0), li(1).toDouble, li(2).toDouble, li(3).toDouble)
    }
    // 读入数据结束
    println("读入数据结束")

    // 2. 计算
    println("计算结束,开始写入")

    // 3. 保存结果
    val fileWriter = new FileWriter("score_result.txt")
    fileWriter.write("高三19班成绩单 \r")
    stuList.foreach(stu => {
      val total = stu.yuwen + stu.yingyu + stu.shuxue
      val avg = total / 3
      fileWriter.write(s"${stu.name}, 总分:${total}, 平均分:${avg} \r\n")
    })
    fileWriter.close()
  }
}

image.png

1. 自动生成的代码

  • 样例类:自动生成 applyunapplytoStringequalshashCodecopy 等方法,无需手动实现。(比如 Circle(2) 直接创建对象,无需 new;模式匹配时能自动解构属性)
  • 普通类:默认只有构造器,上述方法都需要手动定义。

2. 构造器参数

  • 样例类:构造器参数默认是 val(不可变),也可以显式声明为 var(但不推荐)。
  • 普通类:构造器参数默认是 “局部变量”,需要显式加 val/var 才能成为类的成员属性。

3. 模式匹配

  • 样例类:天生支持模式匹配(因为自动生成 unapply 方法),比如代码中 case Circle(radius) => ... 可以直接解构属性。
  • 普通类:要支持模式匹配,必须手动定义 unapply 方法(比较繁琐)。

4. 用途场景

  • 样例类:常用于数据载体(比如 DTO、不可变数据模型)、模式匹配场景。
  • 普通类:适用于需要复杂逻辑、可变状态、自定义行为的场景。